summaryrefslogtreecommitdiff
path: root/common/usb_pd_protocol.c
diff options
context:
space:
mode:
authorli feng <li1.feng@intel.com>2020-09-19 17:46:19 -0700
committerCommit Bot <commit-bot@chromium.org>2020-09-23 23:54:09 +0000
commite7eadea4bf1bbef469e661263ecd3a016e5bd1ad (patch)
treeafa26643df133dc38aa19c17cfb79fac23d1fce9 /common/usb_pd_protocol.c
parentda7a19ba2716dc4420caf8eb62c6f4e6f1bef4cc (diff)
downloadchrome-ec-e7eadea4bf1bbef469e661263ecd3a016e5bd1ad.tar.gz
usb_pd: Add common function to get PD revision
Add common function for both TCPMv1 and TCPMv2 to get PD revision Modify TCPMv1 pd_get_vdo_ver() to get correct cable VDO version BUG=none BRANCH=none TEST=make buildall Signed-off-by: li feng <li1.feng@intel.com> Change-Id: I7cc597a45e9581346683b7af54894bffb48d16bd Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2420468 Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
Diffstat (limited to 'common/usb_pd_protocol.c')
-rw-r--r--common/usb_pd_protocol.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index aed9e4dd86..83d16720d1 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -344,29 +344,32 @@ static inline void set_state_timeout(int port,
pd[port].timeout_state = timeout_state;
}
-#ifdef CONFIG_USB_PD_REV30
-int pd_get_rev(int port)
+int pd_get_rev(int port, enum tcpm_transmit_type type)
{
- return pd[port].rev;
-}
+#ifdef CONFIG_USB_PD_REV30
+ /* TCPMv1 Only stores PD revision for SOP and SOP' types */
+ ASSERT(type < NUM_SOP_STAR_TYPES - 1);
-int pd_get_vdo_ver(int port, enum tcpm_transmit_type type)
-{
if (type == TCPC_TX_SOP_PRIME)
return get_usb_pd_cable_revision(port);
- return vdo_ver[pd[port].rev];
-}
+ return pd[port].rev;
#else
-int pd_get_rev(int port)
-{
return PD_REV20;
+#endif
}
+
int pd_get_vdo_ver(int port, enum tcpm_transmit_type type)
{
+#ifdef CONFIG_USB_PD_REV30
+ if (type == TCPC_TX_SOP_PRIME)
+ return vdo_ver[get_usb_pd_cable_revision(port)];
+
+ return vdo_ver[pd[port].rev];
+#else
return VDM_VER10;
-}
#endif
+}
/* Return flag for pd state is connected */
int pd_is_connected(int port)
@@ -984,7 +987,7 @@ static int send_control(int port, int type)
int bit_len;
uint16_t header = PD_HEADER(type, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, 0,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
/*
* For PD 3.0, collision avoidance logic needs to know if this message
* will begin a new Atomic Message Sequence (AMS)
@@ -1022,11 +1025,11 @@ static int send_source_cap(int port, enum ams_seq ams)
/* No source capabilities defined, sink only */
header = PD_HEADER(PD_CTRL_REJECT, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, 0,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
else
header = PD_HEADER(PD_DATA_SOURCE_CAP, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, src_pdo_cnt,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
bit_len = pd_transmit(port, TCPC_TX_SOP, header, src_pdo, ams);
if (debug_level >= 2)
@@ -1197,7 +1200,7 @@ static void send_sink_cap(int port)
int bit_len;
uint16_t header = PD_HEADER(PD_DATA_SINK_CAP, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, pd_snk_pdo_cnt,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
bit_len = pd_transmit(port, TCPC_TX_SOP, header, pd_snk_pdo,
AMS_RESPONSE);
@@ -1210,7 +1213,7 @@ static int send_request(int port, uint32_t rdo)
int bit_len;
uint16_t header = PD_HEADER(PD_DATA_REQUEST, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, 1,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
/* Note: ams will need to be AMS_START if used for PPS keep alive */
bit_len = pd_transmit(port, TCPC_TX_SOP, header, &rdo, AMS_RESPONSE);
@@ -1230,7 +1233,7 @@ static int send_bist_cmd(int port)
int bit_len;
uint16_t header = PD_HEADER(PD_DATA_BIST, pd[port].power_role,
pd[port].data_role, pd[port].msg_id, 1,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
bit_len = pd_transmit(port, TCPC_TX_SOP, header, &bdo, AMS_START);
CPRINTF("C%d BIST>%d\n", port, bit_len);
@@ -2172,7 +2175,8 @@ static void exit_tbt_mode_sop_prime(int port)
header = PD_HEADER(PD_DATA_VENDOR_DEF, pd[port].power_role,
pd[port].data_role, pd[port].msg_id,
- (int)pd[port].vdo_count, pd_get_rev(port), 0);
+ (int)pd[port].vdo_count,
+ pd_get_rev(port, TCPC_TX_SOP), 0);
pd[port].vdo_data[0] = VDO(USB_VID_INTEL, 1,
CMD_EXIT_MODE | VDO_OPOS(opos));
@@ -2225,7 +2229,7 @@ static void pd_vdm_send_state_machine(int port)
0,
pd[port].msg_id,
(int)pd[port].vdo_count,
- pd_get_rev(port),
+ pd_get_rev(port, TCPC_TX_SOP),
0);
res = pd_transmit(port, msg_type, header,
pd[port].vdo_data, AMS_START);
@@ -2249,7 +2253,9 @@ static void pd_vdm_send_state_machine(int port)
pd[port].data_role,
pd[port].msg_id,
(int)pd[port].vdo_count,
- pd_get_rev(port), 0);
+ pd_get_rev
+ (port, TCPC_TX_SOP),
+ 0);
if ((msg_type == TCPC_TX_SOP_PRIME_PRIME) &&
IS_ENABLED(CONFIG_USBC_SS_MUX)) {
@@ -2269,7 +2275,7 @@ static void pd_vdm_send_state_machine(int port)
pd[port].data_role,
pd[port].msg_id,
(int)pd[port].vdo_count,
- pd_get_rev(port), 0);
+ pd_get_rev(port, TCPC_TX_SOP), 0);
res = pd_transmit(port, TCPC_TX_SOP, header,
pd[port].vdo_data, AMS_START);
}