summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2022-06-28 12:13:02 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-06-29 22:04:01 +0000
commitd32978f7d43da4fb7844e87749685fcc8a4cc91d (patch)
treeb1a33565a7e7690ac2c1829a69bc311e8774494b
parente4c264209e509db0b4ed674dab7012f40ca00d32 (diff)
downloadchrome-ec-d32978f7d43da4fb7844e87749685fcc8a4cc91d.tar.gz
chgstv2: Support bypass mode
This patch adds bypass mode to charge_state_v2. Bypass mode allows a charger to deliver the input power directly from an adapter to the system, avoiding loss in buck-boost conversion. BUG=b:214057333 BRANCH=None TEST=buildall Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Change-Id: Ia3c244190416cd9b9d89dac67cccf9bc033ed691 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3733417 Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r--common/charge_state_v2.c17
-rw-r--r--include/battery_smart.h1
-rw-r--r--include/charge_state_v2.h7
3 files changed, 25 insertions, 0 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 396e841d07..6e2ee3642f 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -945,6 +945,11 @@ test_mockable int calc_is_full(void)
return ret;
}
+__overridable int board_should_charger_bypass(void)
+{
+ return false;
+}
+
/*
* Ask the charger for some voltage and current. If either value is 0,
* charging is disabled; otherwise it's enabled. Negative values are ignored.
@@ -953,6 +958,7 @@ static int charge_request(int voltage, int current)
{
int r1 = EC_SUCCESS, r2 = EC_SUCCESS, r3 = EC_SUCCESS, r4 = EC_SUCCESS;
static int prev_volt, prev_curr;
+ bool should_bypass;
if (!voltage || !current) {
#ifdef CONFIG_CHARGER_NARROW_VDC
@@ -980,6 +986,17 @@ static int charge_request(int voltage, int current)
}
/*
+ * Enable bypass mode if applicable. Transition from Bypass to Bypass +
+ * CHRG or backward is done after this call (by set_current & set_mode)
+ * thus not done here. Similarly, when bypass is disabled, transitioning
+ * from nvdc + chrg will be done separately.
+ */
+ should_bypass = board_should_charger_bypass();
+ if ((should_bypass && !(curr.chg.status & CHARGER_BYPASS_MODE))
+ || (!should_bypass && (curr.chg.status & CHARGER_BYPASS_MODE)))
+ charger_enable_bypass_mode(0, should_bypass);
+
+ /*
* Set current before voltage so that if we are just starting
* to charge, we allow some time (i2c delay) for charging circuit to
* start at a voltage just above battery voltage before jumping
diff --git a/include/battery_smart.h b/include/battery_smart.h
index c37b7c692c..cdc69e4ffd 100644
--- a/include/battery_smart.h
+++ b/include/battery_smart.h
@@ -150,6 +150,7 @@
#define CHARGER_POWER_FAIL BIT(13)
#define CHARGER_BATTERY_PRESENT BIT(14)
#define CHARGER_AC_PRESENT BIT(15)
+#define CHARGER_BYPASS_MODE BIT(16)
/* Charger specification info */
#define INFO_CHARGER_SPEC(INFO) ((INFO) & 0xf)
#define INFO_SELECTOR_SUPPORT(INFO) (((INFO) >> 4) & 1)
diff --git a/include/charge_state_v2.h b/include/charge_state_v2.h
index cdf6872aab..e94a31c242 100644
--- a/include/charge_state_v2.h
+++ b/include/charge_state_v2.h
@@ -223,4 +223,11 @@ __test_only void reset_prev_disp_charge(void);
*/
__test_only bool charging_progress_displayed(void);
+/**
+ * Callback for boards to request charger to enable bypass mode on/off.
+ *
+ * @return True for requesting bypass on. False for requesting bypass off.
+ */
+int board_should_charger_bypass(void);
+
#endif /* __CROS_EC_CHARGE_STATE_V2_H */