From b8eefd91c1f0b9c86c0b9d06daedec5c81ee8863 Mon Sep 17 00:00:00 2001 From: David Hendricks Date: Tue, 29 May 2012 12:58:04 -0700 Subject: [PATCH] stm32: assert/de-assert GPIO_PMIC_PWRON_L with keyboard power event This sets the PMIC_PWRON_L signal to correspond with the keyboard power button state. BUG=chrome-os-partner:9821 TEST=Tested on Lucas (see notes below) Signed-off-by: David Hendricks 1. AC power plugged in, AP off, EC booted > gpioget PMIC_PWRON_L 1* PMIC_PWRON_L 2. AP running, press and release power button (should see screen zoom out and then back in, but I don't have a monitor...) 2a. AP running, power button not pressed > gpioget PMIC_PWRON_L 1 PMIC_PWRON_L 2b. Press power button > Waiting for long power press 280507864 > gpioget PMIC_PWRON_L 0* PMIC_PWRON_L 2c. release power button before 8s > Cancel power off > gpioget PMIC_PWRON_L 1* PMIC_PWRON_L 3. From AP off state, press and hold keyboard power button > gpioget PMIC_PWRON_L 0* PMIC_PWRON_L After 8s, we see: Timeout waiting for GPIO 0/KB_PWR_ON_L Power button was not released in time Shutdown complete. 4. AP on, press and hold keyboard power button > gpioget PMIC_PWRON_L 1 PMIC_PWRON_L > Waiting for long power press 654024769 > gpioget PMIC_PWRON_L 0* PMIC_PWRON_L > Power off after long press now=654025073, 0 ending loop 2 Shutdown complete. <-- Note: This message comes from power_off() which also de-asserts PMIC_PWRON_L > gpioget PMIC_PWRON_L 1* PMIC_PWRON_L Change-Id: I6955771707ecea2926570be0e8bd77ebddbca4d4 --- common/gaia_power.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/gaia_power.c b/common/gaia_power.c index 5a9f5bde3d..519099d0eb 100644 --- a/common/gaia_power.c +++ b/common/gaia_power.c @@ -152,6 +152,8 @@ static int check_for_power_off_event(void) now = get_time(); if (pressed) { + gpio_set_level(GPIO_PMIC_PWRON_L, 0); + if (!power_button_was_pressed) { power_off_deadline.val = now.val + DELAY_FORCE_SHUTDOWN; CPRINTF("Waiting for long power press %u\n", @@ -164,6 +166,7 @@ static int check_for_power_off_event(void) } } else if (power_button_was_pressed) { CPUTS("Cancel power off\n"); + gpio_set_level(GPIO_PMIC_PWRON_L, 1); } power_button_was_pressed = pressed;