summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-10-12 11:19:58 -0700
committerGerrit <chrome-bot@google.com>2012-10-12 14:24:39 -0700
commit8c742b2fc33a7182034fad6166a4953b79161052 (patch)
treea445e82a88956d53da6f1c6d95d4188bd6a00ea9
parent94063c0f35d18cdfab0b678ee965220284a80f4d (diff)
downloadchrome-ec-8c742b2fc33a7182034fad6166a4953b79161052.tar.gz
link: Ignore keyboard when lid is closed
The lid is flexible enough that it's possible to press keys by squeezing the laptop. To keep this from waking the device from suspend or powering it on, don't scan the keyboard or power button when the lid is closed. BUG=chrome-os-partner:15252 BRANCH=link TEST=manual - boot system - use a magnet near the search key to trigger the lid-closed switch - press space, then power. neither one should trigger resume - remove magnet. system resumes - space and power should work as expected again - log out - use magnet to trigger lid-closed switch (looking at EC console output is handy here). system should shut down - pressing power should not boot the system - remove magnet; system will boot - pressing power should work as expected again Change-Id: I92080237b0a2f21774301df3d8e866878697b793 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/35425 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--chip/lm4/keyboard_scan.c14
-rw-r--r--chip/lm4/power_button.c28
2 files changed, 28 insertions, 14 deletions
diff --git a/chip/lm4/keyboard_scan.c b/chip/lm4/keyboard_scan.c
index 33c894e8c1..ef7dfd6b94 100644
--- a/chip/lm4/keyboard_scan.c
+++ b/chip/lm4/keyboard_scan.c
@@ -102,6 +102,12 @@ static void enter_polling_mode(void)
lm4_select_column(COLUMN_TRI_STATE_ALL);
}
+static int is_scanning_enabled(void)
+{
+ /* Scan only if enabled AND lid is open. */
+ return lm4_get_scanning_enabled() && power_lid_open_debounced();
+}
+
/**
* Read the raw keyboard matrix state.
*
@@ -311,7 +317,7 @@ static int check_keys_changed(uint8_t *state)
any_change = 1;
/* Inform keyboard module if scanning is enabled */
- if (lm4_get_scanning_enabled())
+ if (is_scanning_enabled())
keyboard_state_changed(i, c, new_mask ? 1 : 0);
}
}
@@ -453,13 +459,13 @@ void keyboard_scan_task(void)
* starting to pay attention to edges.
*/
if ((lm4_read_raw_row_state() == 0xff) ||
- !lm4_get_scanning_enabled())
+ !is_scanning_enabled())
task_wait_event(-1);
- } while (!lm4_get_scanning_enabled());
+ } while (!is_scanning_enabled());
enter_polling_mode();
/* Busy polling keyboard state. */
- while (lm4_get_scanning_enabled()) {
+ while (is_scanning_enabled()) {
/* Check for keys down */
if (check_keys_changed(debounced_state)) {
key_press_timer = 0;
diff --git a/chip/lm4/power_button.c b/chip/lm4/power_button.c
index 3407d7e701..a928f4895b 100644
--- a/chip/lm4/power_button.c
+++ b/chip/lm4/power_button.c
@@ -130,25 +130,33 @@ static void set_pwrbtn_to_pch(int high)
gpio_set_level(GPIO_PCH_PWRBTNn, high);
}
+/**
+ * Get raw lid switch state.
+ *
+ * @return 1 if lid is open, 0 if closed.
+ */
+static int get_lid_open(void)
+{
+ return gpio_get_level(GPIO_LID_SWITCHn) ? 1 : 0;
+}
-/* Get raw power button signal state; 1 if power button is pressed, 0 if not
- * pressed. */
+/**
+ * Get raw power button signal state.
+ *
+ * @return 1 if power button is pressed, 0 if not pressed.
+ */
static int get_power_button_pressed(void)
{
if (simulate_power_pressed)
return 1;
- return gpio_get_level(GPIO_POWER_BUTTONn) ? 0 : 1;
-}
+ /* Ignore power button if lid is closed */
+ if (!get_lid_open())
+ return 0;
-
-/* Get raw lid switch state; 1 if lid is open, 0 if closed. */
-static int get_lid_open(void)
-{
- return gpio_get_level(GPIO_LID_SWITCHn) ? 1 : 0;
+ return gpio_get_level(GPIO_POWER_BUTTONn) ? 0 : 1;
}
-
static void update_backlight(void)
{
/* Only enable the backlight if the lid is open */