diff options
Diffstat (limited to 'baseboard/octopus/variant_ec_npcx796fb.c')
-rw-r--r-- | baseboard/octopus/variant_ec_npcx796fb.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/baseboard/octopus/variant_ec_npcx796fb.c b/baseboard/octopus/variant_ec_npcx796fb.c index f85184738d..6c839cbb10 100644 --- a/baseboard/octopus/variant_ec_npcx796fb.c +++ b/baseboard/octopus/variant_ec_npcx796fb.c @@ -5,9 +5,15 @@ /* Common code for VARIANT_OCTOPUS_EC_NPCX796FB configuration */ +#include "charge_manager.h" +#include "chipset.h" #include "gpio.h" #include "i2c.h" +#include "power.h" +#include "usb_pd.h" +#include "usbc_ppc.h" #include "util.h" +#include "timer.h" /******************************************************************************/ /* I2C port map configuration */ @@ -20,3 +26,43 @@ const struct i2c_port_t i2c_ports[] = { {"sensor", I2C_PORT_SENSOR, 100, GPIO_I2C7_SCL, GPIO_I2C7_SDA}, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); + +#define HIBERNATE_VBUS_LEVEL_MV 5000 + +void board_hibernate(void) +{ + int port; + + /* + * To support hibernate called from console commands, ectool commands + * and key sequence, shutdown the AP before hibernating. + */ + chipset_force_shutdown(); + + /* + * If we are charging, then drop the Vbus level down to 5V to ensure + * that we don't get locked out of the 6.8V OVLO for our PPCs in + * dead-battery mode. This is needed when the TCPC/PPC rails go away. + * (b/79218851) + */ + port = charge_manager_get_active_charge_port(); + if (port != CHARGE_PORT_NONE) + pd_request_source_voltage(port, HIBERNATE_VBUS_LEVEL_MV); + + /* + * Delay allows AP power state machine to settle down along + * with any PD contract renegotiation. + */ + msleep(100); + + for (port = 0; port < CONFIG_USB_PD_PORT_COUNT; port++) { + /* + * If Vbus isn't already on this port, then open the SNK path + * to allow AC to pass through to the charger when connected. + * This is need if the TCPC/PPC rails do not go away. + * (b/79173959) + */ + if (!pd_is_vbus_present(port)) + ppc_vbus_sink_enable(port, 1); + } +} |