summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Broch <tbroch@chromium.org>2017-02-17 18:57:20 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2017-11-30 02:54:28 +0000
commit6416ef7d8f28a6565f91ac373dc8aa5e5a1234f5 (patch)
tree973b6546ac8c407d20b72db475ff3cc9b5c1ddd9
parenta01d3bb0adf90f435f9ac1813e73f8088469c3ce (diff)
downloadchrome-ec-6416ef7d8f28a6565f91ac373dc8aa5e5a1234f5.tar.gz
pd: prefer CD pin assignments over EF for USBC->USBC case.
Signed-off-by: Todd Broch <tbroch@chromium.org> BRANCH=samus,glados,oak,gru,reef BUG=chromium:694597 TEST=manual, connect samus to USB-C monitor via cable and see it select pin assigmnent 'C' Original-Change-Id: Iddad5b654715bd30ba081c62f8fb53e07816498c Originally-Reviewed-on: https://chromium-review.googlesource.com/465379 Commit-Ready: Todd Broch <tbroch@chromium.org> Tested-by: Todd Broch <tbroch@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org> (cherry picked from commit a8e6b070cbd107d8c2f44f44ae8231a4f4efea90) Change-Id: Ibbe7a0368ad4e7dc44ef22d2bd546bf72c75b9b4 Reviewed-on: https://chromium-review.googlesource.com/506666 Reviewed-by: Benson Leung <bleung@chromium.org> Reviewed-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org> Commit-Queue: Todd Broch <tbroch@chromium.org> Tested-by: Todd Broch <tbroch@chromium.org>
-rw-r--r--common/usb_pd_policy.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index 2eeb08097d..bab22d8482 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -456,8 +456,8 @@ static void dfp_consume_attention(int port, uint32_t *payload)
}
/*
- * This algorithm defaults to choosing higher pin config over lower ones. Pin
- * configs are organized in pairs with the following breakdown.
+ * This algorithm defaults to choosing higher pin config over lower ones in
+ * order to prefer multi-function if desired.
*
* NAME | SIGNALING | OUTPUT TYPE | MULTI-FUNCTION | PIN CONFIG
* -------------------------------------------------------------
@@ -471,9 +471,8 @@ static void dfp_consume_attention(int port, uint32_t *payload)
* if UFP has NOT asserted multi-function preferred code masks away B/D/F
* leaving only A/C/E. For single-output dongles that should leave only one
* possible pin config depending on whether its a converter DP->(VGA|HDMI) or DP
- * output. If someone creates a multi-output dongle presumably they would need
- * to either offer different mode capabilities depending upon connection type or
- * the DFP would need additional system policy to expose those options.
+ * output. If UFP is a USB-C receptacle it may assert C/D/E/F. The DFP USB-C
+ * receptacle must always choose C/D in those cases.
*/
int pd_dfp_dp_get_pin_mode(int port, uint32_t status)
{
@@ -495,6 +494,10 @@ int pd_dfp_dp_get_pin_mode(int port, uint32_t status)
/* TODO(crosbug.com/p/39656) revisit if DFP drives USB Gen 2 signals */
pin_caps &= ~MODE_DP_PIN_BR2_MASK;
+ /* if C/D present they have precedence over E/F for USB-C->USB-C */
+ if (pin_caps & (MODE_DP_PIN_C | MODE_DP_PIN_D))
+ pin_caps &= ~(MODE_DP_PIN_E | MODE_DP_PIN_F);
+
/* get_next_bit returns undefined for zero */
if (!pin_caps)
return 0;