From aeeadc2b31fa829b66c1e4366346d2dc81d03e76 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/+/4507756 Commit-Queue: Derek Basehore Tested-by: Derek Basehore Reviewed-by: Daisuke Nojiri --- common/charge_state_v2.c | 16 ++++++++++------ test/sbs_charging_v2.c | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 1970b51a58..2835f6b7f8 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1432,11 +1432,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 */ @@ -1445,8 +1446,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 041f4f9a45..f47e349672 100644 --- a/test/sbs_charging_v2.c +++ b/test/sbs_charging_v2.c @@ -964,7 +964,7 @@ test_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); @@ -974,7 +974,7 @@ test_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