diff options
author | Patryk Duda <pdk@semihalf.com> | 2021-02-19 13:51:11 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-02-19 22:57:26 +0000 |
commit | 72ce3ba8b0806cb707358097589080b26f4cef51 (patch) | |
tree | 4412fc7eaa9d4dd0c03b8a09a948cc2222bc6a53 | |
parent | e1b5a71ac27bc6bcac0c4fc304b3f1784e8048b5 (diff) | |
download | chrome-ec-72ce3ba8b0806cb707358097589080b26f4cef51.tar.gz |
charge_manager: Notify PD if active charger can provide more power
When multiple chargers are connected first connected charger will
provide maximum power while others will remain at 5V. If the active
charger is removed charge manager should send new power request to PD.
CL:2592498 introduces bug which prevents charge manager from sending
new power request to other charger if active charger is removed.
This CL implements checking if active charger is providing as much
power as possible. If more power can be provided charge manager will
send new power request to PD.
BUG=b:161775827
BRANCH=none
TEST=Run firmware_PDVbusRequest FAFT test.
TEST=Connect chargers to both USB-C ports. First connected charger
should negotiate target voltage, while second charger should
remain at 5V. Disconnect first charger and check if second
charger negotiated higher voltage.
Signed-off-by: Patryk Duda <pdk@semihalf.com>
Change-Id: I2e53a572871dfcacf33d3024c2c2f017cfdca43e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2707105
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Commit-Queue: Aseda Aboagye <aaboagye@chromium.org>
Tested-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r-- | common/charge_manager.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c index e113179372..c7a3c31cd2 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -17,6 +17,7 @@ #include "system.h" #include "tcpm/tcpm.h" #include "timer.h" +#include "usb_common.h" #include "usb_pd.h" #include "usb_pd_dpm.h" #include "usb_pd_tcpm.h" @@ -885,6 +886,9 @@ static void charge_manager_refresh(void) IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE)) || (IS_ENABLED(CONFIG_USB_PD_TCPMV2) && IS_ENABLED(CONFIG_USB_PE_SM))) { + uint32_t pdo; + uint32_t max_voltage; + uint32_t max_current; /* * Check if new voltage/current is different * than requested. If yes, send new power request @@ -894,6 +898,18 @@ static void charge_manager_refresh(void) pd_get_requested_current(updated_new_port) != charge_current_uncapped) pd_set_new_power_request(updated_new_port); + + /* + * Check if we can get more power from this port. + * If yes, send new power request + */ + pd_find_pdo_index(pd_get_src_cap_cnt(updated_new_port), + pd_get_src_caps(updated_new_port), + pd_get_max_voltage(), &pdo); + pd_extract_pdo_power(pdo, &max_current, &max_voltage); + if (charge_voltage != max_voltage || + charge_current_uncapped != max_current) + pd_set_new_power_request(updated_new_port); } else { /* * Functions for getting requested voltage/current |