summaryrefslogtreecommitdiff
path: root/common/charge_manager.c
diff options
context:
space:
mode:
authorAseda Aboagye <aaboagye@google.com>2017-08-10 13:12:30 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-08-11 20:10:20 -0700
commit79ae73477c1d6a84ce9c64eb82a183a163aa3646 (patch)
tree6afeec8aa404c0750d079a326712fc3ab39fd4aa /common/charge_manager.c
parent97fe22e8d559449cbd9df5cc2065f5ab5941830e (diff)
downloadchrome-ec-79ae73477c1d6a84ce9c64eb82a183a163aa3646.tar.gz
charge_manager: Consider port in source PDO.
When CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT is defined for a board, as its name implies, the board can source a higher current if there is only one port acting as a source. This commit fixes an issue with selecting the right source capability message to advertise. charge_manager_get_source_pdo() was simply checking if there was more than one sink connected, instead of checking if there were any *other* sinks connected. In the event that a sink was connected to a different port, we would advertise the max source PDO. BUG=b:64037926, b:35577509 BRANCH=gru,eve,reef TEST=Connect sink to port 1. Connect a AMA to port 0 that claims that VBUS isn't necessary. Start sending source caps, verify that the max PDO is not being advertised in the source caps. Change-Id: Ie4145ecaf98d5b9070ad3e8b139e5653685fa801 Signed-off-by: Aseda Aboagye <aaboagye@google.com> Reviewed-on: https://chromium-review.googlesource.com/610479 Commit-Ready: Aseda Aboagye <aaboagye@chromium.org> Tested-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'common/charge_manager.c')
-rw-r--r--common/charge_manager.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 7b119da347..9d9226cb19 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -963,20 +963,20 @@ void charge_manager_source_port(int port, int enable)
}
}
-int charge_manager_get_source_pdo(const uint32_t **src_pdo)
+int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port)
{
- int p;
- int count = 0;
-
- /* count the number of connected sinks */
- for (p = 0; p < CONFIG_USB_PD_PORT_COUNT; p++)
- if (source_port_bitmap & (1 << p))
- count++;
-
- /* send the maximum current if we are sourcing only on one port */
- *src_pdo = count <= 1 ? pd_src_pdo_max : pd_src_pdo;
+ /* Are there any other connected sinks? */
+ if (source_port_bitmap & ~(1 << port)) {
+ *src_pdo = pd_src_pdo;
+ return pd_src_pdo_cnt;
+ }
- return count <= 1 ? pd_src_pdo_cnt : pd_src_pdo_max_cnt;
+ /*
+ * If not, send the maximum current since we're sourcing on only one
+ * port.
+ */
+ *src_pdo = pd_src_pdo_max;
+ return pd_src_pdo_max_cnt;
}
#endif /* CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT */