summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2021-05-28 10:48:14 -0700
committerCommit Bot <commit-bot@chromium.org>2021-08-12 06:26:08 +0000
commitb55081fd7232797ac734f347bdfbf87a3c9c107f (patch)
treebfa88550a366663d148a79156de7fb758d684e4a
parent41b421ece4a0d2410dab38febe85996577d1fd7c (diff)
downloadchrome-ec-b55081fd7232797ac734f347bdfbf87a3c9c107f.tar.gz
chgstv2: Refactor charger_discharge_on_ac
This patch makes charger_discharge_on_ac call board_discharge_on_ac. It also makes set_chg_ctrl_mode call charger_discharge_on_ac. This makes sense since when the charge control mode changes, discharge-on-ac also needs to be enabled or disabled. BUG=b:188457962 BRANCH=none TEST=make runhosttests Change-Id: I65ec09f580afc987cc86f4c60c15c1f90ead6c3c Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2986848 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3088963 Tested-by: Eric Yilun Lin <yllin@google.com> Auto-Submit: Eric Yilun Lin <yllin@google.com> Reviewed-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Eric Yilun Lin <yllin@google.com>
-rw-r--r--common/charge_state_v2.c61
-rw-r--r--common/charger.c3
-rw-r--r--include/ec_commands.h2
3 files changed, 37 insertions, 29 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 7222af1f37..8ebc54052d 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1409,23 +1409,45 @@ void chgstate_set_manual_voltage(int volt_mv)
/* Force charging off before the battery is full. */
static int set_chg_ctrl_mode(enum ec_charge_control_mode mode)
{
+ bool discharge_on_ac = false;
+ int current, voltage;
+ int rv;
+
+ current = manual_current;
+ voltage = manual_voltage;
+
+ if (mode >= CHARGE_CONTROL_COUNT)
+ return EC_ERROR_INVAL;
+
if (mode == CHARGE_CONTROL_NORMAL) {
- chg_ctl_mode = mode;
- manual_current = -1;
- manual_voltage = -1;
+ current = -1;
+ voltage = -1;
} else {
- /*
- * Changing mode is only meaningful if external power is
- * present. If it's not present we can't charge anyway.
- */
+ /* Changing mode is only meaningful if AC is present. */
if (!curr.ac)
return EC_ERROR_NOT_POWERED;
- chg_ctl_mode = mode;
- manual_current = 0;
- manual_voltage = 0;
+ if (mode == CHARGE_CONTROL_DISCHARGE) {
+ if (!IS_ENABLED(CONFIG_CHARGER_DISCHARGE_ON_AC))
+ return EC_ERROR_UNIMPLEMENTED;
+ discharge_on_ac = true;
+ } else if (mode == CHARGE_CONTROL_IDLE) {
+ current = 0;
+ voltage = 0;
+ }
+ }
+
+ if (IS_ENABLED(CONFIG_CHARGER_DISCHARGE_ON_AC)) {
+ rv = charger_discharge_on_ac(discharge_on_ac);
+ if (rv != EC_SUCCESS)
+ return rv;
}
+ /* Commit all atomically */
+ chg_ctl_mode = mode;
+ manual_current = current;
+ manual_voltage = voltage;
+
return EC_SUCCESS;
}
@@ -2696,16 +2718,6 @@ charge_command_charge_control(struct host_cmd_handler_args *args)
if (rv != EC_SUCCESS)
return EC_RES_ERROR;
-#ifdef CONFIG_CHARGER_DISCHARGE_ON_AC
-#ifdef CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM
- rv = board_discharge_on_ac(p->mode == CHARGE_CONTROL_DISCHARGE);
-#else
- rv = charger_discharge_on_ac(p->mode == CHARGE_CONTROL_DISCHARGE);
-#endif
- if (rv != EC_SUCCESS)
- return EC_RES_ERROR;
-#endif
-
return EC_RES_SUCCESS;
}
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_CONTROL, charge_command_charge_control,
@@ -2911,7 +2923,6 @@ static int command_chgstate(int argc, char **argv)
CHARGE_CONTROL_NORMAL);
if (rv)
return rv;
-#ifdef CONFIG_CHARGER_DISCHARGE_ON_AC
} else if (!strcasecmp(argv[1], "discharge")) {
if (argc <= 2)
return EC_ERROR_PARAM_COUNT;
@@ -2921,14 +2932,6 @@ static int command_chgstate(int argc, char **argv)
CHARGE_CONTROL_NORMAL);
if (rv)
return rv;
-#ifdef CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM
- rv = board_discharge_on_ac(val);
-#else
- rv = charger_discharge_on_ac(val);
-#endif /* CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM */
- if (rv)
- return rv;
-#endif /* CONFIG_CHARGER_DISCHARGE_ON_AC */
} else if (!strcasecmp(argv[1], "debug")) {
if (argc <= 2)
return EC_ERROR_PARAM_COUNT;
diff --git a/common/charger.c b/common/charger.c
index e3d77976ae..764f8b7ba7 100644
--- a/common/charger.c
+++ b/common/charger.c
@@ -456,6 +456,9 @@ enum ec_error_list charger_discharge_on_ac(int enable)
int chgnum;
int rv = EC_ERROR_UNIMPLEMENTED;
+ if (IS_ENABLED(CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM))
+ return board_discharge_on_ac(enable);
+
/*
* When discharge on AC is selected, cycle through all chargers to
* enable or disable this feature.
diff --git a/include/ec_commands.h b/include/ec_commands.h
index 11fedccc99..d69a56377c 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -4254,6 +4254,8 @@ enum ec_charge_control_mode {
CHARGE_CONTROL_NORMAL = 0,
CHARGE_CONTROL_IDLE,
CHARGE_CONTROL_DISCHARGE,
+ /* Add no more entry below. */
+ CHARGE_CONTROL_COUNT,
};
#define EC_CHARGE_MODE_TEXT { \