From 24bc963111a5aa0c419d75918807c55ed420095b Mon Sep 17 00:00:00 2001 From: Derek Basehore Date: Thu, 4 May 2023 14:55:37 -0700 Subject: chgstv2: Always discharge if soc is > sustainer_soc.upper For the Charge Limit feature, we need to discharge down to the upper limit for the battery sustainer. The Charge Limit feature requires that the system never charge above 80%, so if the feature is enabled when the system is over that, it needs to discharge down to 80%. BUG=b:222619859 TEST=run-sbs_charging_v2 Change-Id: I3f65743144de64411484dd3f2aa6c5fd681a47c9 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4507759 Tested-by: Derek Basehore Reviewed-by: Daisuke Nojiri Commit-Queue: Derek Basehore Auto-Submit: Derek Basehore --- common/charge_state_v2.c | 15 ++++++++++----- 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; -- cgit v1.2.1