diff options
-rw-r--r-- | common/charge_state_v2.c | 15 | ||||
-rw-r--r-- | test/sbs_charging_v2.c | 4 |
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; |