diff options
author | Ting Shen <phoenixshen@google.com> | 2022-07-06 14:58:17 +0800 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-07-06 11:07:56 +0000 |
commit | fae23638fb5f71a14a9a1461e59f4e890a885b1d (patch) | |
tree | d4b04bf0e0cc2412718397659ef5c20ddceb1a5c | |
parent | 18a45420f62bfe4e45fa5b11c122722951f1629f (diff) | |
download | chrome-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.c | 30 |
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); } |