summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/tcpm/mt6370.c24
-rw-r--r--driver/tcpm/tcpci.h1
2 files changed, 14 insertions, 11 deletions
diff --git a/driver/tcpm/mt6370.c b/driver/tcpm/mt6370.c
index a9881b34d1..c7414601a1 100644
--- a/driver/tcpm/mt6370.c
+++ b/driver/tcpm/mt6370.c
@@ -58,12 +58,11 @@ static int mt6370_init(int port)
return rv;
}
-#ifndef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
static int mt6370_get_cc(int port, int *cc1, int *cc2)
{
int status;
int rv;
- int role;
+ int role, is_snk;
rv = tcpc_read(port, TCPC_REG_CC_STATUS, &status);
@@ -87,24 +86,27 @@ static int mt6370_get_cc(int port, int *cc1, int *cc2)
*/
rv = tcpc_read(port, TCPC_REG_ROLE_CTRL, &role);
- if (*cc1 != TYPEC_CC_VOLT_OPEN)
- *cc1 |= (TCPC_REG_ROLE_CTRL_CC1(role) == TYPEC_CC_RD) << 2;
- if (*cc2 != TYPEC_CC_VOLT_OPEN)
- *cc2 |= (TCPC_REG_ROLE_CTRL_CC2(role) == TYPEC_CC_RD) << 2;
+ if (TCPC_REG_ROLE_CTRL_DRP(role))
+ is_snk = TCPC_REG_CC_STATUS_TERM(status);
+ else
+ /* CC1/CC2 states are the same, checking one-side is enough. */
+ is_snk = TCPC_REG_CC_STATUS_CC1(role) == TYPEC_CC_RD;
+
+ if (is_snk) {
+ if (*cc1 != TYPEC_CC_VOLT_OPEN)
+ *cc1 |= 0x04;
+ if (*cc2 != TYPEC_CC_VOLT_OPEN)
+ *cc2 |= 0x04;
+ }
return rv;
}
-#endif
/* MT6370 is a TCPCI compatible port controller */
const struct tcpm_drv mt6370_tcpm_drv = {
.init = &mt6370_init,
.release = &tcpci_tcpm_release,
-#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
- .get_cc = &tcpci_tcpm_get_cc,
-#else
.get_cc = &mt6370_get_cc,
-#endif
#ifdef CONFIG_USB_PD_VBUS_DETECT_TCPC
.get_vbus_level = &tcpci_tcpm_get_vbus_level,
#endif
diff --git a/driver/tcpm/tcpci.h b/driver/tcpm/tcpci.h
index 877e510210..1af01d9b60 100644
--- a/driver/tcpm/tcpci.h
+++ b/driver/tcpm/tcpci.h
@@ -54,6 +54,7 @@
#define TCPC_REG_ROLE_CTRL 0x1a
#define TCPC_REG_ROLE_CTRL_SET(drp, rp, cc1, cc2) \
((drp) << 6 | (rp) << 4 | (cc2) << 2 | (cc1))
+#define TCPC_REG_ROLE_CTRL_DRP(reg) (((reg) & 0x40) >> 6)
#define TCPC_REG_ROLE_CTRL_RP_MASK 0x30
#define TCPC_REG_ROLE_CTRL_RP(reg) (((reg) & TCPC_REG_ROLE_CTRL_RP_MASK) >> 4)
#define TCPC_REG_ROLE_CTRL_CC2(reg) (((reg) & 0xc) >> 2)