From: Xu Yang Date: Wed, 11 Dec 2024 10:57:53 +0000 (+0800) Subject: usb: typec: tcpci: set local CC to Rd only when cc1/cc2 status is Rp X-Git-Tag: v6.14-rc1~69^2~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8534229375f8cc4422039fbad74c4ca01ef2f651;p=thirdparty%2Fkernel%2Flinux.git usb: typec: tcpci: set local CC to Rd only when cc1/cc2 status is Rp The cc1 and cc2 status returned by tcpci_get_cc() may be TYPEC_CC_OPEN or TYPEC_CC_RA. So don't assume it's just TYPEC_CC_RD or TYPEC_CC_RP_*. This will let local port present Rd on CC only when cc1/cc2 status is TYPEC_CC_RP_*. Signed-off-by: Xu Yang Acked-by: Heikki Krogerus Link: https://lore.kernel.org/r/20241211105753.1205312-1-xu.yang_2@nxp.com Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c index ed32583829bec..2f15734a5043b 100644 --- a/drivers/usb/typec/tcpm/tcpci.c +++ b/drivers/usb/typec/tcpm/tcpci.c @@ -282,7 +282,7 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc, if (cc2 == TYPEC_CC_RD) /* Role control would have the Rp setting when DRP was enabled */ reg |= FIELD_PREP(TCPC_ROLE_CTRL_CC2, TCPC_ROLE_CTRL_CC_RP); - else + else if (cc2 >= TYPEC_CC_RP_DEF) reg |= FIELD_PREP(TCPC_ROLE_CTRL_CC2, TCPC_ROLE_CTRL_CC_RD); } else { reg &= ~TCPC_ROLE_CTRL_CC1; @@ -290,7 +290,7 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc, if (cc1 == TYPEC_CC_RD) /* Role control would have the Rp setting when DRP was enabled */ reg |= FIELD_PREP(TCPC_ROLE_CTRL_CC1, TCPC_ROLE_CTRL_CC_RP); - else + else if (cc1 >= TYPEC_CC_RP_DEF) reg |= FIELD_PREP(TCPC_ROLE_CTRL_CC1, TCPC_ROLE_CTRL_CC_RD); } }