summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2022-07-06 14:58:17 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-07-06 11:07:56 +0000
commitfae23638fb5f71a14a9a1461e59f4e890a885b1d (patch)
treed4b04bf0e0cc2412718397659ef5c20ddceb1a5c
parent18a45420f62bfe4e45fa5b11c122722951f1629f (diff)
downloadchrome-ec-fae23638fb5f71a14a9a1461e59f4e890a885b1d.tar.gz
charge_manager: return max available power in PD_POWER_INFO command
When DPS enabled, it could select a low but more efficient PDO for charging. If the selected power is less than usb-min-ac-watts, a "low-power charger connected" popup appears and causes user confution. In this case, we should return the maximum available power instead the current selected power. BUG=b:237988097 TEST=When DPS picks a PDO less than usb-min-ac-watts, verify: 1) no "low-power charger" warning popup 2) `ectool usbpdpower` prints the maximum possible PDO power BRANCH=tomato Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: Iaec76c9c81ee930222841b047efefb12162086c7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3747172 Reviewed-by: Eric Yilun Lin <yllin@google.com> Tested-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> (cherry picked from commit e205e2fe5e7eb5c10afba2b35704a66db86a8cc4) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3748018 Commit-Queue: Chen-Tsung Hsieh <chentsung@chromium.org> Reviewed-by: Chen-Tsung Hsieh <chentsung@chromium.org> Auto-Submit: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--common/charge_manager.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 041f41f1bc..53f5209515 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -441,6 +441,8 @@ static void charge_manager_fill_power_info(int port,
}
} else {
int use_ramp_current;
+ uint32_t max_mv, max_ma, pdo, unused;
+
switch (sup) {
case CHARGE_SUPPLIER_PD:
r->type = USB_CHG_TYPE_PD;
@@ -489,7 +491,24 @@ static void charge_manager_fill_power_info(int port,
r->type = USB_CHG_TYPE_OTHER;
#endif
}
- r->meas.voltage_max = available_charge[sup][port].voltage;
+
+ if (IS_ENABLED(CONFIG_USB_PD_DPS) && dps_is_enabled() &&
+ sup == CHARGE_SUPPLIER_PD) {
+ /*
+ * Returns the maximum power the system can request when
+ * DPS enabled. This is to prevent the system think it's
+ * using a low power charger.
+ */
+ pd_find_pdo_index(pd_get_src_cap_cnt(port),
+ pd_get_src_caps(port),
+ pd_get_max_voltage(), &pdo);
+ pd_extract_pdo_power(pdo, &max_ma, &max_mv, &unused);
+ } else {
+ max_mv = available_charge[sup][port].voltage;
+ max_ma = available_charge[sup][port].current;
+ }
+
+ r->meas.voltage_max = max_mv;
/*
* Report unknown charger CHARGE_DETECT_DELAY after supplier
@@ -530,15 +549,12 @@ static void charge_manager_fill_power_info(int port,
*/
r->meas.current_max = chg_ramp_is_stable() ?
r->meas.current_lim : chg_ramp_max(port, sup,
- available_charge[sup][port].current);
+ max_ma);
- r->max_power =
- r->meas.current_max * r->meas.voltage_max;
} else {
- r->meas.current_max = r->meas.current_lim =
- available_charge[sup][port].current;
- r->max_power = POWER(available_charge[sup][port]);
+ r->meas.current_max = r->meas.current_lim = max_ma;
}
+ r->max_power = r->meas.current_max * r->meas.voltage_max;
r->meas.voltage_now = get_vbus_voltage(port, r->role);
}