diff options
author | Ben Lok <ben.lok@mediatek.com> | 2015-08-21 19:28:32 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-09-07 05:26:22 -0700 |
commit | efa83d23c76fcaee32254cd01ef9d44997622e9a (patch) | |
tree | 3380167973bf7306939ac7fe59f74fb6a0bc6bee | |
parent | e8bdf07a58850cfac026b4ad8409c229446a9243 (diff) | |
download | chrome-ec-efa83d23c76fcaee32254cd01ef9d44997622e9a.tar.gz |
oak: shutdown tmp432 if AC isn't present in non-S0 state
To reduce the power consumption in non-S0 AP power state,
Shut tmp432 down if external power isn't present.
BRANCH=none
BUG=chrome-os-partner:43118
TEST=manual
1. make BOARD=oak -j
2. shutdown AP by EC console command:
> apshutdown
3. plug external power
4. check whether tmp432 is still running:
> tmp432
5. unplug external power
6. check whether tmp432 is shutdown:
> tmp432
Change-Id: I4726a18c8754dbe60070d878dff143c76d586dcc
Signed-off-by: Ben Lok <ben.lok@mediatek.com>
Reviewed-on: https://chromium-review.googlesource.com/295059
Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r-- | board/oak/board.c | 77 | ||||
-rw-r--r-- | board/oak/board.h | 3 | ||||
-rw-r--r-- | board/oak/build.mk | 2 | ||||
-rw-r--r-- | board/oak/extpower.c | 51 |
4 files changed, 80 insertions, 53 deletions
diff --git a/board/oak/board.c b/board/oak/board.c index 6759383f90..3ad925b042 100644 --- a/board/oak/board.c +++ b/board/oak/board.c @@ -196,9 +196,22 @@ void __board_i2c_set_timeout(int port, uint32_t timeout) void i2c_set_timeout(int port, uint32_t timeout) __attribute__((weak, alias("__board_i2c_set_timeout"))); +/** + * There is a level shift for AC_OK & LID_OPEN signal between AP & EC, + * disable it (drive high) when AP is off, otherwise enable it (drive low). + */ +static void board_extpower_buffer_to_soc(void) +{ + /* Drive high when AP is off (G3), else drive low */ + gpio_set_level(GPIO_LEVEL_SHIFT_EN_L, + chipset_in_state(CHIPSET_STATE_HARD_OFF) ? 1 : 0); +} + /* Initialize board. */ static void board_init(void) { + /* Enable Level shift of AC_OK & LID_OPEN signals */ + board_extpower_buffer_to_soc(); /* Enable rev1 testing GPIOs */ gpio_set_level(GPIO_SYSTEM_POWER_H, 1); /* Enable PD MCU interrupt */ @@ -465,3 +478,67 @@ void vbus_task(void) } } #endif /* BOARD_REV < OAK_REV4 */ + +#ifdef CONFIG_TEMP_SENSOR_TMP432 +static void tmp432_set_power_deferred(void) +{ + /* Shut tmp432 down if not in S0 && no external power */ + if (!extpower_is_present() && !chipset_in_state(CHIPSET_STATE_ON)) { + if (EC_SUCCESS != tmp432_set_power(TMP432_POWER_OFF)) + CPRINTS("ERROR: Can't shutdown TMP432."); + return; + } + + /* else, turn it on. */ + if (EC_SUCCESS != tmp432_set_power(TMP432_POWER_ON)) + CPRINTS("ERROR: Can't turn on TMP432."); +} +DECLARE_DEFERRED(tmp432_set_power_deferred); +#endif + +/** + * Hook of AC change. turn on/off tmp432 depends on AP & AC status. + */ +static void board_extpower(void) +{ + board_extpower_buffer_to_soc(); +#ifdef CONFIG_TEMP_SENSOR_TMP432 + hook_call_deferred(tmp432_set_power_deferred, 0); +#endif +} +DECLARE_HOOK(HOOK_AC_CHANGE, board_extpower, HOOK_PRIO_DEFAULT); + +/* Called on AP S5 -> S3 transition, and before HOOK_CHIPSET_STARTUP */ +static void board_chipset_pre_init(void) +{ + /* Enable level shift of AC_OK when power on */ + board_extpower_buffer_to_soc(); +} +DECLARE_HOOK(HOOK_CHIPSET_PRE_INIT, board_chipset_pre_init, HOOK_PRIO_DEFAULT); + +/* Called on AP S3 -> S5 transition */ +static void board_chipset_shutdown(void) +{ + /* Disable level shift to SoC when shutting down */ + gpio_set_level(GPIO_LEVEL_SHIFT_EN_L, 1); +} +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT); + + +/* Called on AP S3 -> S0 transition */ +static void board_chipset_resume(void) +{ +#ifdef CONFIG_TEMP_SENSOR_TMP432 + hook_call_deferred(tmp432_set_power_deferred, 0); +#endif +} +DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT); + +/* Called on AP S0 -> S3 transition */ +static void board_chipset_suspend(void) +{ +#ifdef CONFIG_TEMP_SENSOR_TMP432 + hook_call_deferred(tmp432_set_power_deferred, 0); +#endif +} +DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT); diff --git a/board/oak/board.h b/board/oak/board.h index 1bd3fbc390..d2a26f272e 100644 --- a/board/oak/board.h +++ b/board/oak/board.h @@ -39,6 +39,7 @@ #define CONFIG_CHARGER_V2 #define CONFIG_CHIPSET_MEDIATEK #define CONFIG_CMD_TYPEC +#define CONFIG_EXTPOWER_GPIO #define CONFIG_FORCE_CONSOLE_RESUME /* * EC_WAKE: PA0 - WKUP1 @@ -87,7 +88,7 @@ #undef CONFIG_UART_RX_DMA #undef DEFERRABLE_MAX_COUNT -#define DEFERRABLE_MAX_COUNT 11 +#define DEFERRABLE_MAX_COUNT 12 /* * Allow dangerous commands. diff --git a/board/oak/build.mk b/board/oak/build.mk index 5f438ea75f..dc21970df0 100644 --- a/board/oak/build.mk +++ b/board/oak/build.mk @@ -10,5 +10,5 @@ CHIP := stm32 CHIP_FAMILY := stm32f0 CHIP_VARIANT:= stm32f09x -board-y = board.o battery.o extpower.o led.o +board-y = board.o battery.o led.o board-$(CONFIG_USB_POWER_DELIVERY)+=usb_pd_policy.o diff --git a/board/oak/extpower.c b/board/oak/extpower.c deleted file mode 100644 index c9efa4c0fa..0000000000 --- a/board/oak/extpower.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright 2015 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* - * Pure GPIO-based external power detection, buffered to PCH. - * Drive high in S5-S0 when AC_PRESENT is high, otherwise drive low. - */ - -#include "chipset.h" -#include "common.h" -#include "gpio.h" -#include "hooks.h" -#include "system.h" -#include "util.h" - -int extpower_is_present(void) -{ - return gpio_get_level(GPIO_AC_PRESENT); -} - -static void extpower_buffer_to_soc(void) -{ - /* Drive high when AP is off */ - gpio_set_level(GPIO_LEVEL_SHIFT_EN_L, - chipset_in_state(CHIPSET_STATE_HARD_OFF) ? 1 : 0); -} -DECLARE_HOOK(HOOK_CHIPSET_PRE_INIT, extpower_buffer_to_soc, HOOK_PRIO_DEFAULT); - -static void extpower_shutdown(void) -{ - /* Disable level shift to SoC when shutting down */ - gpio_set_level(GPIO_LEVEL_SHIFT_EN_L, 1); -} -DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, extpower_shutdown, HOOK_PRIO_DEFAULT); - -void extpower_interrupt(enum gpio_signal signal) -{ - /* Trigger notification of external power change */ - extpower_buffer_to_soc(); -} - -static void extpower_init(void) -{ - extpower_buffer_to_soc(); - - /* Enable interrupts, now that we've initialized */ - gpio_enable_interrupt(GPIO_AC_PRESENT); -} -DECLARE_HOOK(HOOK_INIT, extpower_init, HOOK_PRIO_DEFAULT); |