mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
power: Add virtual-wire power signals support for skylake.
Add virtual wire power signals support for skylake. By adding CONFIG_VW_SIGNALS definition in board level driver, we can save three GPIOs (SLP_S3/SLP_S4/CLK_RUN) on skylake platform. Modified sources: 1. common.c: Add support for VW power signals. 2. skylake.c: Add upper func to get system sleep state through GPIOs or VWs. BRANCH=none BUG=none TEST=make buildall; test boot up and shut down on eSPI POC of wheatley. Change-Id: I0eae363dad8cec011eb32929a40701f19fde7e1a Signed-off-by: Mulin Chao <mlchao@nuvoton.com> Reviewed-on: https://chromium-review.googlesource.com/366711 Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include "task.h"
|
||||
#include "timer.h"
|
||||
#include "util.h"
|
||||
#include "espi.h"
|
||||
|
||||
/* Console output macros */
|
||||
#define CPUTS(outstr) cputs(CC_CHIPSET, outstr)
|
||||
@@ -76,10 +77,25 @@ static int power_signal_get_level(enum gpio_signal signal)
|
||||
#ifdef CONFIG_POWER_S0IX
|
||||
return chipset_get_ps_debounced_level(signal);
|
||||
#else
|
||||
#ifdef CONFIG_VW_SIGNALS
|
||||
/* Check signal is from GPIOs or VWs */
|
||||
if ((int)signal > VW_SIGNAL_BASE)
|
||||
return espi_vw_get_wire(signal);
|
||||
#endif
|
||||
return gpio_get_level(signal);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int power_signal_enable_interrupt(enum gpio_signal signal)
|
||||
{
|
||||
#ifdef CONFIG_VW_SIGNALS
|
||||
/* Check signal is from GPIOs or VWs */
|
||||
if ((int)signal > VW_SIGNAL_BASE)
|
||||
return espi_vw_enable_wire_int(signal);
|
||||
#endif
|
||||
return gpio_enable_interrupt(signal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update input signals mask
|
||||
*/
|
||||
@@ -384,7 +400,7 @@ static void power_common_init(void)
|
||||
|
||||
/* Enable interrupts for input signals */
|
||||
for (i = 0; i < POWER_SIGNAL_COUNT; i++, s++)
|
||||
gpio_enable_interrupt(s->gpio);
|
||||
power_signal_enable_interrupt(s->gpio);
|
||||
|
||||
/*
|
||||
* Update input state again since there is a small window
|
||||
@@ -421,6 +437,10 @@ DECLARE_HOOK(HOOK_AC_CHANGE, power_ac_change, HOOK_PRIO_DEFAULT);
|
||||
/*****************************************************************************/
|
||||
/* Interrupts */
|
||||
|
||||
#if defined(CONFIG_BRINGUP) && defined(CONFIG_VW_SIGNALS)
|
||||
#error "Not support CONFIG_BRINGUP since gpio_get_name func"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BRINGUP
|
||||
#define MAX_SIGLOG_ENTRIES 24
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "util.h"
|
||||
#include "wireless.h"
|
||||
#include "lpc.h"
|
||||
#include "espi.h"
|
||||
|
||||
/* Console output macros */
|
||||
#define CPUTS(outstr) cputs(CC_CHIPSET, outstr)
|
||||
@@ -55,6 +56,32 @@ static int throttle_cpu; /* Throttle CPU? */
|
||||
static int forcing_shutdown; /* Forced shutdown in progress? */
|
||||
static int power_s5_up; /* Chipset is sequencing up or down */
|
||||
|
||||
enum sys_sleep_state {
|
||||
SYS_SLEEP_S5,
|
||||
SYS_SLEEP_S4,
|
||||
SYS_SLEEP_S3
|
||||
};
|
||||
|
||||
/* Get system sleep state through GPIOs or VWs */
|
||||
static int chipset_get_sleep_signal(enum sys_sleep_state state)
|
||||
{
|
||||
#ifdef CONFIG_VW_SIGNALS
|
||||
if (state == SYS_SLEEP_S4)
|
||||
return espi_vw_get_wire(VW_SLP_S4_L);
|
||||
else if (state == SYS_SLEEP_S3)
|
||||
return espi_vw_get_wire(VW_SLP_S3_L);
|
||||
#else
|
||||
if (state == SYS_SLEEP_S4)
|
||||
return gpio_get_level(GPIO_PCH_SLP_S4_L);
|
||||
else if (state == SYS_SLEEP_S3)
|
||||
return gpio_get_level(GPIO_PCH_SLP_S3_L);
|
||||
#endif
|
||||
|
||||
/* We should never run here */
|
||||
ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void chipset_force_shutdown(void)
|
||||
{
|
||||
CPRINTS("%s()", __func__);
|
||||
@@ -219,7 +246,7 @@ static enum power_state _power_handle_state(enum power_state state)
|
||||
if (power_s5_up)
|
||||
return power_wait_s5_rtc_reset();
|
||||
#endif
|
||||
if (gpio_get_level(GPIO_PCH_SLP_S4_L) == 1)
|
||||
if (chipset_get_sleep_signal(SYS_SLEEP_S4) == 1)
|
||||
return POWER_S5S3; /* Power up to next state */
|
||||
break;
|
||||
|
||||
@@ -228,10 +255,10 @@ static enum power_state _power_handle_state(enum power_state state)
|
||||
/* Required rail went away */
|
||||
chipset_force_shutdown();
|
||||
return POWER_S3S5;
|
||||
} else if (gpio_get_level(GPIO_PCH_SLP_S3_L) == 1) {
|
||||
} else if (chipset_get_sleep_signal(SYS_SLEEP_S3) == 1) {
|
||||
/* Power up to next state */
|
||||
return POWER_S3S0;
|
||||
} else if (gpio_get_level(GPIO_PCH_SLP_S4_L) == 0) {
|
||||
} else if (chipset_get_sleep_signal(SYS_SLEEP_S4) == 0) {
|
||||
/* Power down to next state */
|
||||
return POWER_S3S5;
|
||||
}
|
||||
@@ -243,10 +270,10 @@ static enum power_state _power_handle_state(enum power_state state)
|
||||
return POWER_S0S3;
|
||||
#ifdef CONFIG_POWER_S0IX
|
||||
} else if ((gpio_get_level(GPIO_PCH_SLP_S0_L) == 0) &&
|
||||
(gpio_get_level(GPIO_PCH_SLP_S3_L) == 1)) {
|
||||
(chipset_get_sleep_signal(SYS_SLEEP_S3) == 1)) {
|
||||
return POWER_S0S0ix;
|
||||
#endif
|
||||
} else if (gpio_get_level(GPIO_PCH_SLP_S3_L) == 0) {
|
||||
} else if (chipset_get_sleep_signal(SYS_SLEEP_S3) == 0) {
|
||||
/* Power down to next state */
|
||||
return POWER_S0S3;
|
||||
}
|
||||
@@ -259,7 +286,7 @@ static enum power_state _power_handle_state(enum power_state state)
|
||||
* TODO: add code for unexpected power loss
|
||||
*/
|
||||
if ((gpio_get_level(GPIO_PCH_SLP_S0_L) == 1) &&
|
||||
(gpio_get_level(GPIO_PCH_SLP_S3_L) == 1)) {
|
||||
(chipset_get_sleep_signal(SYS_SLEEP_S3) == 1)) {
|
||||
return POWER_S0ixS0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user