diff options
-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; |