summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/charge_state_v2.c15
-rw-r--r--test/sbs_charging_v2.c4
2 files changed, 12 insertions, 7 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 70e676a07a..be9c98052f 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1539,10 +1539,12 @@ static void sustain_battery_soc(void)
*/
switch (mode) {
case CHARGE_CONTROL_NORMAL:
- /* Going up */
- if (sustain_soc.upper < soc)
- mode = sustain_soc.upper == sustain_soc.lower ?
- CHARGE_CONTROL_IDLE : CHARGE_CONTROL_DISCHARGE;
+ /* Going up. Always DISCHARGE if the soc is above upper. */
+ if (sustain_soc.lower == soc && soc == sustain_soc.upper) {
+ mode = CHARGE_CONTROL_IDLE;
+ } else if (sustain_soc.upper < soc) {
+ mode = CHARGE_CONTROL_DISCHARGE;
+ }
break;
case CHARGE_CONTROL_IDLE:
/* Discharging naturally */
@@ -1551,8 +1553,11 @@ static void sustain_battery_soc(void)
break;
case CHARGE_CONTROL_DISCHARGE:
/* Discharging actively. */
- if (soc < sustain_soc.lower)
+ if (sustain_soc.lower == soc && soc == sustain_soc.upper) {
+ mode = CHARGE_CONTROL_IDLE;
+ } else if (soc < sustain_soc.lower) {
mode = CHARGE_CONTROL_NORMAL;
+ }
break;
default:
return;
diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c
index addd438d7e..e1c7602ad8 100644
--- a/test/sbs_charging_v2.c
+++ b/test/sbs_charging_v2.c
@@ -831,7 +831,7 @@ static int test_battery_sustainer_discharge_idle(void)
/* (lower =) upper < SoC */
display_soc = 810;
wait_charging_state();
- TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE);
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
/* Unplug AC. Sustainer gets deactivated. */
gpio_set_level(GPIO_AC_PRESENT, 0);
@@ -841,7 +841,7 @@ static int test_battery_sustainer_discharge_idle(void)
/* Replug AC. Sustainer gets re-activated. */
gpio_set_level(GPIO_AC_PRESENT, 1);
wait_charging_state();
- TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE);
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
/* lower = SoC = upper */
display_soc = 800;