summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatryk Duda <pdk@semihalf.com>2021-02-19 13:51:11 +0000
committerCommit Bot <commit-bot@chromium.org>2021-02-19 22:57:26 +0000
commit72ce3ba8b0806cb707358097589080b26f4cef51 (patch)
tree4412fc7eaa9d4dd0c03b8a09a948cc2222bc6a53
parente1b5a71ac27bc6bcac0c4fc304b3f1784e8048b5 (diff)
downloadchrome-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.c16
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