summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/usb_pd_protocol.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index 89885c3e84..12b1546217 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -329,15 +329,17 @@ static void set_polarity(int port, int polarity)
#ifdef CONFIG_USBC_VCONN
static void set_vconn(int port, int enable)
{
-#ifdef CONFIG_USBC_PPC
/*
- * USB-C PPCs can source their own Vconn. No need to tell the TCPC
- * to source its own.
+ * We always need to tell the TCPC to enable Vconn first, otherwise some
+ * TCPCs get confused and think the CC line is in over voltage mode and
+ * immediately disconnects. If there is a PPC, both devices will
+ * potentially source Vconn, but that should be okay since Vconn has
+ * "make before break" electrical requirements when swapping anyway.
*/
- ppc_set_vconn(port, enable);
-#else /* !defined(CONFIG_USBC_PPC) */
tcpm_set_vconn(port, enable);
-#endif /* defined(CONFIG_USBC_PPC) */
+#ifdef CONFIG_USBC_PPC
+ ppc_set_vconn(port, enable);
+#endif
}
#endif /* defined(CONFIG_USBC_VCONN) */