diff options
author | Vijay Hiremath <vijay.p.hiremath@intel.com> | 2016-10-27 16:58:16 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-28 21:07:46 -0700 |
commit | cbc14b38f405821618ffd18c4c271f2ccfa1ab5a (patch) | |
tree | efbcea3a6608c0dbd4a4998bf88d1ea346c5f407 | |
parent | df028763fb7f51e61011e6c3fdbbb410b7243797 (diff) | |
download | chrome-ec-cbc14b38f405821618ffd18c4c271f2ccfa1ab5a.tar.gz |
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>
-rw-r--r-- | board/reef/board.c | 3 | ||||
-rw-r--r-- | driver/charger/bd9995x.c | 26 | ||||
-rw-r--r-- | driver/charger/bd9995x.h | 2 |
3 files changed, 19 insertions, 12 deletions
diff --git a/board/reef/board.c b/board/reef/board.c index 68d3e5f95c..87bc929d60 100644 --- a/board/reef/board.c +++ b/board/reef/board.c @@ -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 { diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c index 675afafe90..137cd25b6f 100644 --- a/driver/charger/bd9995x.c +++ b/driver/charger/bd9995x.c @@ -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]); } diff --git a/driver/charger/bd9995x.h b/driver/charger/bd9995x.h index ea27b88715..a9538b5dc0 100644 --- a/driver/charger/bd9995x.h +++ b/driver/charger/bd9995x.h @@ -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; |