reef: Enable BD9995X power save mode when hibernated

Turn off the charger BGATE when the system is hibernated to
save maximum power.

BUG=chrome-os-partner:59001
BRANCH=none
TEST=Manually verified on the Reef.
     System can boot from hibernate wake sources.
     Following are the power measurement values at Battery
     voltage = 8.3V & temperature = 23 deg C.
     a. Normal operation 540uA, 3.500mW
     b. BGATE OFF        80uA, 0.592mW

Change-Id: Ia30655ccefbf0dded623246150d53b2a815df2de
Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/404685
Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Reviewed-by: Shawn N <shawnn@chromium.org>
This commit is contained in:
Vijay Hiremath
2016-10-27 16:58:16 -07:00
committed by chrome-bot
parent df028763fb
commit cbc14b38f4
3 changed files with 19 additions and 12 deletions

View File

@@ -918,6 +918,9 @@ void board_hibernate(void)
/* Enable both the VBUS & VCC ports before entering PG3 */
bd9995x_select_input_port(BD9995X_CHARGE_PORT_BOTH, 1);
/* Turn BGATE OFF for saving the power */
bd9995x_set_power_save_mode(BD9995X_PWR_SAVE_MAX);
}
struct {

View File

@@ -630,7 +630,6 @@ int charger_set_voltage(int voltage)
static void bd99995_init(void)
{
int reg;
int power_save_mode = BD9995X_PWR_SAVE_OFF;
const struct battery_info *bi = battery_get_info();
/* Enable BC1.2 detection on VCC */
@@ -708,10 +707,10 @@ static void bd99995_init(void)
/* Power save mode when VBUS/VCC is removed. */
#ifdef CONFIG_BD9995X_POWER_SAVE_MODE
power_save_mode = CONFIG_BD9995X_POWER_SAVE_MODE;
bd9995x_set_power_save_mode(CONFIG_BD9995X_POWER_SAVE_MODE);
#else
bd9995x_set_power_save_mode(BD9995X_PWR_SAVE_OFF);
#endif
ch_raw_write16(BD9995X_CMD_SMBREG, power_save_mode,
BD9995X_EXTENDED_COMMAND);
#ifdef CONFIG_USB_PD_DISCHARGE
/* Set VBUS / VCC detection threshold for discharge enable */
@@ -855,6 +854,11 @@ int bd9995x_get_battery_temp(int *temp_ptr)
}
#endif
void bd9995x_set_power_save_mode(int mode)
{
ch_raw_write16(BD9995X_CMD_SMBREG, mode, BD9995X_EXTENDED_COMMAND);
}
#ifdef HAS_TASK_USB_CHG
int bd9995x_get_bc12_ilim(int charge_supplier)
{
@@ -913,23 +917,21 @@ int bd9995x_bc12_enable_charging(enum bd9995x_charge_port port, int enable)
void usb_charger_set_switches(int port, enum usb_switch setting)
{
int power_save_mode = BD9995X_PWR_SAVE_OFF;
/* If switch is not changing then return */
if (setting == usb_switch_state[port])
return;
if (setting != USB_SWITCH_RESTORE)
usb_switch_state[port] = setting;
/* ensure we disable power saving when we are using DP/DN */
#ifdef CONFIG_BD9995X_POWER_SAVE_MODE
power_save_mode = (usb_switch_state[0] == USB_SWITCH_DISCONNECT &&
usb_switch_state[1] == USB_SWITCH_DISCONNECT)
? CONFIG_BD9995X_POWER_SAVE_MODE
: BD9995X_PWR_SAVE_OFF;
bd9995x_set_power_save_mode(
(usb_switch_state[0] == USB_SWITCH_DISCONNECT &&
usb_switch_state[1] == USB_SWITCH_DISCONNECT)
? CONFIG_BD9995X_POWER_SAVE_MODE : BD9995X_PWR_SAVE_OFF);
#endif
ch_raw_write16(BD9995X_CMD_SMBREG, power_save_mode,
BD9995X_EXTENDED_COMMAND);
bd9995x_enable_usb_switch(port, usb_switch_state[port]);
}

View File

@@ -357,6 +357,8 @@ int bd9995x_bc12_enable_charging(enum bd9995x_charge_port port, int enable);
void bd9995x_vbus_interrupt(enum gpio_signal signal);
/* Read temperature measurement value (in Celsius) */
int bd9995x_get_battery_temp(int *temp_ptr);
/* Set power save mode */
void bd9995x_set_power_save_mode(int mode);
#ifdef CONFIG_CMD_I2C_STRESS_TEST_CHARGER
extern struct i2c_stress_test_dev bd9995x_i2c_stress_test_dev;