summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2013-04-23 11:06:16 -0700
committerChromeBot <chrome-bot@google.com>2013-04-24 00:06:00 -0700
commit01279936cb7836ee5cef7e4c2332f6a6338a3162 (patch)
treeee87fca649059c9f5a44661b6489b53c73758610
parent3def4e04fa3ff2b28cfebdb2c4717fc51913a725 (diff)
downloadchrome-ec-01279936cb7836ee5cef7e4c2332f6a6338a3162.tar.gz
Unify lid switch processing
STM32-based platforms now use the same lid debouncing code as LM4-based platforms, generate lid-open / lid-closed events, and trigger lid-change hooks. This is needed for disabling keyboard scanning when the lid is closed, as well as future changes to mask off wake events when the lid is closed. BUG=chrome-os-partner:18896 BRANCH=spring TEST=build all platforms; check that spring boots when lid is opened Change-Id: I09a6e91119c3739297fe49b7eacac6efda988284 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/48924 Reviewed-by: Vic Yang <victoryang@chromium.org>
-rw-r--r--board/daisy/board.c3
-rw-r--r--board/daisy/board.h1
-rw-r--r--board/pit/board.c3
-rw-r--r--board/pit/board.h1
-rw-r--r--board/snow/board.c3
-rw-r--r--board/snow/board.h1
-rw-r--r--board/spring/board.c3
-rw-r--r--board/spring/board.h1
-rw-r--r--common/gaia_power.c37
-rw-r--r--include/gaia_power.h2
10 files changed, 31 insertions, 24 deletions
diff --git a/board/daisy/board.c b/board/daisy/board.c
index e67ec8d3a8..0961df5a2f 100644
--- a/board/daisy/board.c
+++ b/board/daisy/board.c
@@ -9,6 +9,7 @@
#include "gpio.h"
#include "i2c.h"
#include "keyboard_raw.h"
+#include "lid_switch.h"
#include "pmu_tpschrome.h"
#include "registers.h"
#include "spi.h"
@@ -39,7 +40,7 @@ const struct gpio_info gpio_list[GPIO_COUNT] = {
{"PP1800_LDO2", GPIO_A, (1<<1), GPIO_INT_BOTH, gaia_power_event},
{"XPSHOLD", GPIO_A, (1<<3), GPIO_INT_RISING, gaia_power_event},
{"CHARGER_INT", GPIO_C, (1<<4), GPIO_INT_RISING, NULL},
- {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_RISING, gaia_lid_event},
+ {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_BOTH, lid_interrupt},
{"SUSPEND_L", GPIO_A, (1<<7), GPIO_INT_BOTH, gaia_suspend_event},
{"KB_IN00", GPIO_C, (1<<8), GPIO_KB_INPUT,
keyboard_raw_gpio_interrupt},
diff --git a/board/daisy/board.h b/board/daisy/board.h
index 6c2dec6d65..557f5c646d 100644
--- a/board/daisy/board.h
+++ b/board/daisy/board.h
@@ -28,6 +28,7 @@
#define CONFIG_I2C_HOST_AUTO
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_SUPPRESS_NOISE
+#define CONFIG_LID_SWITCH
#define CONFIG_PMU_TPS65090
#define CONFIG_SMART_BATTERY
diff --git a/board/pit/board.c b/board/pit/board.c
index 61294f8d7e..54d5a96980 100644
--- a/board/pit/board.c
+++ b/board/pit/board.c
@@ -9,6 +9,7 @@
#include "gpio.h"
#include "i2c.h"
#include "keyboard_raw.h"
+#include "lid_switch.h"
#include "pmu_tpschrome.h"
#include "registers.h"
#include "spi.h"
@@ -25,7 +26,7 @@ const struct gpio_info gpio_list[GPIO_COUNT] = {
{"PP1800_LDO2", GPIO_A, (1<<1), GPIO_INT_BOTH, gaia_power_event},
{"XPSHOLD", GPIO_A, (1<<3), GPIO_INT_RISING, gaia_power_event},
{"CHARGER_INT", GPIO_C, (1<<6), GPIO_INT_RISING, pmu_irq_handler},
- {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_RISING, gaia_lid_event},
+ {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_BOTH, lid_interrupt},
{"SUSPEND_L", GPIO_C, (1<<7), GPIO_INT_BOTH, gaia_suspend_event},
{"KB_IN00", GPIO_C, (1<<8), GPIO_KB_INPUT,
keyboard_raw_gpio_interrupt},
diff --git a/board/pit/board.h b/board/pit/board.h
index a4d7c8106f..72987bc2dc 100644
--- a/board/pit/board.h
+++ b/board/pit/board.h
@@ -31,6 +31,7 @@
#define CONFIG_HOST_COMMAND_STATUS
#define CONFIG_I2C
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_LID_SWITCH
#define CONFIG_PMU_BOARD_INIT
#define CONFIG_PMU_HARD_RESET
#define CONFIG_PMU_TPS65090
diff --git a/board/snow/board.c b/board/snow/board.c
index bfa4857aa4..4efe5dab39 100644
--- a/board/snow/board.c
+++ b/board/snow/board.c
@@ -13,6 +13,7 @@
#include "hooks.h"
#include "i2c.h"
#include "keyboard_raw.h"
+#include "lid_switch.h"
#include "pmu_tpschrome.h"
#include "power_led.h"
#include "registers.h"
@@ -34,7 +35,7 @@ const struct gpio_info gpio_list[GPIO_COUNT] = {
{"PP1800_LDO2", GPIO_A, (1<<1), GPIO_INT_BOTH, gaia_power_event},
{"XPSHOLD", GPIO_A, (1<<3), GPIO_INT_BOTH, gaia_power_event},
{"CHARGER_INT", GPIO_C, (1<<4), GPIO_INT_FALLING, pmu_irq_handler},
- {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_RISING, gaia_lid_event},
+ {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_BOTH, lid_interrupt},
{"SUSPEND_L", GPIO_A, (1<<7), INT_BOTH_FLOATING, gaia_suspend_event},
{"WP_L", GPIO_B, (1<<4), GPIO_INPUT, NULL},
{"KB_IN00", GPIO_C, (1<<8), GPIO_KB_INPUT,
diff --git a/board/snow/board.h b/board/snow/board.h
index b404e94aa0..36a55e94a4 100644
--- a/board/snow/board.h
+++ b/board/snow/board.h
@@ -35,6 +35,7 @@
#define CONFIG_I2C_ARBITRATION
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_KEYBOARD_SUPPRESS_NOISE
+#define CONFIG_LID_SWITCH
#define CONFIG_PMU_BOARD_INIT
#define CONFIG_PMU_HARD_RESET
#define CONFIG_PMU_TPS65090
diff --git a/board/spring/board.c b/board/spring/board.c
index 6d15c6deac..a81e38cf5f 100644
--- a/board/spring/board.c
+++ b/board/spring/board.c
@@ -16,6 +16,7 @@
#include "host_command.h"
#include "i2c.h"
#include "keyboard_raw.h"
+#include "lid_switch.h"
#include "pmu_tpschrome.h"
#include "registers.h"
#include "stm32_adc.h"
@@ -35,7 +36,7 @@ const struct gpio_info gpio_list[GPIO_COUNT] = {
{"PP1800_LDO2", GPIO_A, (1<<1), GPIO_INT_BOTH, gaia_power_event},
{"XPSHOLD", GPIO_A, (1<<3), GPIO_INT_BOTH, gaia_power_event},
{"CHARGER_INT", GPIO_C, (1<<4), GPIO_INT_FALLING, pmu_irq_handler},
- {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_RISING, gaia_lid_event},
+ {"LID_OPEN", GPIO_C, (1<<13), GPIO_INT_BOTH, lid_interrupt},
{"SUSPEND_L", GPIO_A, (1<<7), INT_BOTH_FLOATING, gaia_suspend_event},
{"WP_L", GPIO_A, (1<<13), GPIO_INPUT, NULL},
{"KB_IN00", GPIO_C, (1<<8), GPIO_KB_INPUT,
diff --git a/board/spring/board.h b/board/spring/board.h
index 4e7ef827e2..93b087e421 100644
--- a/board/spring/board.h
+++ b/board/spring/board.h
@@ -34,6 +34,7 @@
#define CONFIG_I2C
#define CONFIG_I2C_PASSTHROUGH
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
+#define CONFIG_LID_SWITCH
#define CONFIG_LOW_POWER_IDLE /* Use STOP mode when we have nothing to do */
#define CONFIG_LP5562
#define CONFIG_PMU_BOARD_INIT
diff --git a/common/gaia_power.c b/common/gaia_power.c
index f161f2dca6..769d9ed777 100644
--- a/common/gaia_power.c
+++ b/common/gaia_power.c
@@ -30,6 +30,7 @@
#include "gaia_power.h"
#include "gpio.h"
#include "hooks.h"
+#include "lid_switch.h"
#include "keyboard_scan.h"
#include "power_led.h"
#include "pmu_tpschrome.h"
@@ -102,8 +103,8 @@ static int force_value;
/* 1 if the power button was pressed last time we checked */
static char power_button_was_pressed;
-/* 1 if a change in lid switch state has been detected */
-static char lid_changed;
+/* 1 if lid-open event has been detected */
+static char lid_opened;
/* time where we will power off, if power button still held down */
static timestamp_t power_off_deadline;
@@ -245,7 +246,7 @@ void gaia_suspend_event(enum gpio_signal signal)
ap_suspended = !gpio_get_level(GPIO_SUSPEND_L);
if (ap_suspended) {
- if (gpio_get_level(GPIO_LID_OPEN))
+ if (lid_is_open())
powerled_set_state(POWERLED_STATE_SUSPEND);
else
powerled_set_state(POWERLED_STATE_OFF);
@@ -263,18 +264,21 @@ void gaia_power_event(enum gpio_signal signal)
task_wake(TASK_ID_CHIPSET);
}
-void gaia_lid_event(enum gpio_signal signal)
+static void gaia_lid_event(void)
{
- /* inform power task that lid switch has changed */
- lid_changed = 1;
+ /* Power task only cares about lid-open events */
+ if (!lid_is_open())
+ return;
+
+ lid_opened = 1;
task_wake(TASK_ID_CHIPSET);
}
+DECLARE_HOOK(HOOK_LID_CHANGE, gaia_lid_event, HOOK_PRIO_DEFAULT);
static int gaia_power_init(void)
{
/* Enable interrupts for our GPIOs */
gpio_enable_interrupt(GPIO_KB_PWR_ON_L);
- gpio_enable_interrupt(GPIO_LID_OPEN);
gpio_enable_interrupt(GPIO_PP1800_LDO2);
gpio_enable_interrupt(GPIO_SOC1V8_XPSHOLD);
gpio_enable_interrupt(GPIO_SUSPEND_L);
@@ -347,10 +351,10 @@ void chipset_force_shutdown(void)
/**
* Check if there has been a power-on event
*
- * This checks all power-on event signals and returns boolean 0 or 1 to
- * indicate if any have been triggered (with debounce taken into account).
+ * This checks all power-on event signals and returns non-zero if any have been
+ * triggered (with debounce taken into account).
*
- * @return 1 if there has been a power-on event, 0 if not
+ * @return non-zero if there has been a power-on event, 0 if not.
*/
static int check_for_power_on_event(void)
{
@@ -368,13 +372,10 @@ static int check_for_power_on_event(void)
return 2;
}
- /* to avoid false positives, check lid only if a change was detected */
- if (lid_changed) {
- udelay(LID_SWITCH_DEBOUNCE);
- if (gpio_get_level(GPIO_LID_OPEN) == 1) {
- lid_changed = 0;
- return 3;
- }
+ /* Check lid open */
+ if (lid_opened) {
+ lid_opened = 0;
+ return 3;
}
/* check for power button press */
@@ -508,7 +509,7 @@ static void power_off(void)
chipset_force_shutdown();
ap_on = 0;
ap_suspended = 0;
- lid_changed = 0;
+ lid_opened = 0;
enable_sleep(SLEEP_MASK_AP_RUN);
powerled_set_state(POWERLED_STATE_OFF);
pmu_shutdown();
diff --git a/include/gaia_power.h b/include/gaia_power.h
index b37ce08b8d..4e44e66f2f 100644
--- a/include/gaia_power.h
+++ b/include/gaia_power.h
@@ -16,14 +16,12 @@
* Interrupt handlers for Gaia chipset GPIOs.
*/
void gaia_power_event(enum gpio_signal signal);
-void gaia_lid_event(enum gpio_signal signal);
void gaia_suspend_event(enum gpio_signal signal);
#else
#define gaia_power_event NULL
#define gaia_suspend_event NULL
-#define gaia_lid_event NULL
#endif