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-23 20:44:14 +0000
commit7b91f8bf64bc216d06ed618ff379082cc001259d (patch)
tree89a4abd280238a738507b499ab8210632bc01010
parent9d24984ca1cbc4a676e466826059a670c5f83eb1 (diff)
downloadchrome-ec-7b91f8bf64bc216d06ed618ff379082cc001259d.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> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2715846 Tested-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-by: Abe Levkoy <alevkoy@chromium.org> Commit-Queue: Abe Levkoy <alevkoy@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