summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijay Hiremath <vijay.p.hiremath@intel.com>2016-10-27 16:58:16 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-10-28 21:07:46 -0700
commitcbc14b38f405821618ffd18c4c271f2ccfa1ab5a (patch)
treeefbcea3a6608c0dbd4a4998bf88d1ea346c5f407
parentdf028763fb7f51e61011e6c3fdbbb410b7243797 (diff)
downloadchrome-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.c3
-rw-r--r--driver/charger/bd9995x.c26
-rw-r--r--driver/charger/bd9995x.h2
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;