summaryrefslogtreecommitdiff
path: root/zephyr/emul/tcpc/emul_tcpci_partner_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/emul/tcpc/emul_tcpci_partner_common.c')
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_common.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
index 7a1670fe0e..e7be6250b6 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
@@ -5,6 +5,7 @@
#include "common.h"
#include "driver/tcpm/tcpci.h"
+#include "ec_commands.h"
#include "emul/tcpc/emul_tcpci.h"
#include "emul/tcpc/emul_tcpci_partner_common.h"
#include "usb_pd.h"
@@ -957,8 +958,14 @@ void tcpci_partner_common_swap_data_role(struct tcpci_partner_data *data)
static enum tcpci_partner_handler_res
tcpci_partner_common_dr_swap_handler(struct tcpci_partner_data *data)
{
- tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0);
- tcpci_partner_common_swap_data_role(data);
+ enum pd_ctrl_msg_type response = PD_CTRL_REJECT;
+
+ if ((data->data_role == PD_ROLE_DFP && data->drs_to_ufp_supported) ||
+ (data->data_role == PD_ROLE_UFP && data->drs_to_dfp_supported))
+ response = PD_CTRL_ACCEPT;
+ tcpci_partner_send_control_msg(data, response, 0);
+ if (response == PD_CTRL_ACCEPT)
+ tcpci_partner_common_swap_data_role(data);
return TCPCI_PARTNER_COMMON_MSG_HANDLED;
}
@@ -1642,6 +1649,8 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->send_goodcrc = true;
data->rev = rev;
+ data->drs_to_dfp_supported = true;
+ data->drs_to_ufp_supported = true;
data->vconn_supported = true;
data->ops.transmit = tcpci_partner_transmit_op;
@@ -1659,6 +1668,14 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->cable = NULL;
}
+void tcpci_partner_set_drs_support(struct tcpci_partner_data *data,
+ bool drs_to_ufp_supported,
+ bool drs_to_dfp_supported)
+{
+ data->drs_to_ufp_supported = drs_to_ufp_supported;
+ data->drs_to_dfp_supported = drs_to_dfp_supported;
+}
+
void tcpci_partner_set_vconn_support(struct tcpci_partner_data *data,
bool vconn_supported)
{