summaryrefslogtreecommitdiff
path: root/common/usbc/usb_tc_drp_acc_trysrc_sm.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/usbc/usb_tc_drp_acc_trysrc_sm.c')
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c158
1 files changed, 39 insertions, 119 deletions
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
index c4049451fc..698aca248e 100644
--- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c
+++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
@@ -394,10 +394,10 @@ void pd_set_dual_role(int port, enum pd_dual_role_states state)
}
#ifdef CONFIG_USB_PE_SM
-int pd_get_partner_data_swap_capable(int port)
+bool pd_get_partner_data_swap_capable(int port)
{
/* return data swap capable status of port partner */
- return TC_CHK_FLAG(port, TC_FLAGS_PARTNER_DR_DATA);
+ return !!TC_CHK_FLAG(port, TC_FLAGS_PARTNER_DR_DATA);
}
int pd_comm_is_enabled(int port)
@@ -434,9 +434,9 @@ int pd_ts_dts_plugged(int port)
}
/* Return true if partner port is known to be PD capable. */
-int pd_capable(int port)
+bool pd_capable(int port)
{
- return TC_CHK_FLAG(port, TC_FLAGS_PARTNER_PD_CAPABLE);
+ return !!TC_CHK_FLAG(port, TC_FLAGS_PARTNER_PD_CAPABLE);
}
/*
@@ -670,6 +670,36 @@ enum pd_power_role pd_get_power_role(int port)
return tc[port].power_role;
}
+enum pd_cc_states pd_get_task_cc_state(int port)
+{
+ return tc[port].cc_state;
+}
+
+uint8_t pd_get_task_state(int port)
+{
+ return get_state_tc(port);
+}
+
+bool pd_get_vconn_state(int port)
+{
+ return !!TC_CHK_FLAG(port, TC_FLAGS_VCONN_ON);
+}
+
+bool pd_get_partner_dual_role_power(int port)
+{
+ return !!TC_CHK_FLAG(port, TC_FLAGS_PARTNER_DR_POWER);
+}
+
+bool pd_get_partner_unconstr_power(int port)
+{
+ return !!TC_CHK_FLAG(port, TC_FLAGS_PARTNER_UNCONSTRAINED);
+}
+
+const char *pd_get_task_state_name(int port)
+{
+ return tc_state_names[get_state_tc(port)];
+}
+
int pd_is_vbus_present(int port)
{
if (IS_ENABLED(CONFIG_USB_PD_VBUS_DETECT_TCPC))
@@ -1182,121 +1212,6 @@ static void handle_new_power_state(int port)
* HOST COMMANDS
*/
#ifdef HAS_TASK_HOSTCMD
-static const enum pd_dual_role_states dual_role_map[USB_PD_CTRL_ROLE_COUNT] = {
- [USB_PD_CTRL_ROLE_TOGGLE_ON] = PD_DRP_TOGGLE_ON,
- [USB_PD_CTRL_ROLE_TOGGLE_OFF] = PD_DRP_TOGGLE_OFF,
- [USB_PD_CTRL_ROLE_FORCE_SINK] = PD_DRP_FORCE_SINK,
- [USB_PD_CTRL_ROLE_FORCE_SOURCE] = PD_DRP_FORCE_SOURCE,
- [USB_PD_CTRL_ROLE_FREEZE] = PD_DRP_FREEZE,
-};
-
-#ifdef CONFIG_USBC_SS_MUX
-static const mux_state_t typec_mux_map[USB_PD_CTRL_MUX_COUNT] = {
- [USB_PD_CTRL_MUX_NONE] = USB_PD_MUX_NONE,
- [USB_PD_CTRL_MUX_USB] = USB_PD_MUX_USB_ENABLED,
- [USB_PD_CTRL_MUX_AUTO] = USB_PD_MUX_DP_ENABLED,
- [USB_PD_CTRL_MUX_DP] = USB_PD_MUX_DP_ENABLED,
- [USB_PD_CTRL_MUX_DOCK] = USB_PD_MUX_DOCK,
-};
-#endif
-
-/*
- * TODO(b/142911453): Move this function to a common/usb_common.c to avoid
- * duplicate code
- */
-static enum ec_status hc_usb_pd_control(struct host_cmd_handler_args *args)
-{
- const struct ec_params_usb_pd_control *p = args->params;
- struct ec_response_usb_pd_control_v2 *r_v2 = args->response;
- struct ec_response_usb_pd_control *r = args->response;
-
- if (p->port >= board_get_usb_pd_port_count())
- return EC_RES_INVALID_PARAM;
-
- if (p->role >= USB_PD_CTRL_ROLE_COUNT ||
- p->mux >= USB_PD_CTRL_MUX_COUNT)
- return EC_RES_INVALID_PARAM;
-
- if (p->role != USB_PD_CTRL_ROLE_NO_CHANGE)
- pd_set_dual_role(p->port, dual_role_map[p->role]);
-
-#ifdef CONFIG_USBC_SS_MUX
- if (p->mux != USB_PD_CTRL_MUX_NO_CHANGE)
- usb_mux_set(p->port, typec_mux_map[p->mux],
- typec_mux_map[p->mux] == USB_PD_MUX_NONE ?
- USB_SWITCH_DISCONNECT :
- USB_SWITCH_CONNECT,
- pd_get_polarity(p->port));
-#endif /* CONFIG_USBC_SS_MUX */
-
- if (p->swap == USB_PD_CTRL_SWAP_DATA)
- pd_request_data_swap(p->port);
- else if (p->swap == USB_PD_CTRL_SWAP_POWER)
- pd_request_power_swap(p->port);
-#ifdef CONFIG_USBC_VCONN_SWAP
- else if (p->swap == USB_PD_CTRL_SWAP_VCONN)
- pe_dpm_request(p->port, DPM_REQUEST_VCONN_SWAP);
-#endif
-
- switch (args->version) {
- case 0:
- r->enabled = pd_comm_is_enabled(p->port);
- r->role = tc[p->port].power_role;
- r->polarity = tc[p->port].polarity;
- r->state = get_state_tc(p->port);
- args->response_size = sizeof(*r);
- break;
- case 1:
- case 2:
- if (sizeof(*r_v2) > args->response_max)
- return EC_RES_INVALID_PARAM;
-
- r_v2->enabled =
- (pd_comm_is_enabled(p->port) ?
- PD_CTRL_RESP_ENABLED_COMMS : 0) |
- (pd_is_connected(p->port) ?
- PD_CTRL_RESP_ENABLED_CONNECTED : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_PARTNER_PD_CAPABLE) ?
- PD_CTRL_RESP_ENABLED_PD_CAPABLE : 0);
- r_v2->role =
- (tc[p->port].power_role ? PD_CTRL_RESP_ROLE_POWER : 0) |
- (tc[p->port].data_role ? PD_CTRL_RESP_ROLE_DATA : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_VCONN_ON) ?
- PD_CTRL_RESP_ROLE_VCONN : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_PARTNER_DR_POWER) ?
- PD_CTRL_RESP_ROLE_DR_POWER : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_PARTNER_DR_DATA) ?
- PD_CTRL_RESP_ROLE_DR_DATA : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_PARTNER_USB_COMM) ?
- PD_CTRL_RESP_ROLE_USB_COMM : 0) |
- (TC_CHK_FLAG(p->port, TC_FLAGS_PARTNER_UNCONSTRAINED) ?
- PD_CTRL_RESP_ROLE_UNCONSTRAINED : 0);
- r_v2->polarity = tc[p->port].polarity;
- r_v2->cc_state = tc[p->port].cc_state;
-
- if (IS_ENABLED(CONFIG_USB_PD_ALT_MODE_DFP))
- r_v2->dp_mode = get_dp_pin_mode(p->port);
-
- strzcpy(r_v2->state, tc_state_names[get_state_tc(p->port)],
- sizeof(r_v2->state));
- if (args->version == 1) {
- /*
- * ec_response_usb_pd_control_v2 (r_v2) is a
- * strict superset of ec_response_usb_pd_control_v1
- */
- args->response_size =
- sizeof(struct ec_response_usb_pd_control_v1);
- } else
- args->response_size = sizeof(*r_v2);
- break;
- default:
- return EC_RES_INVALID_PARAM;
- }
- return EC_RES_SUCCESS;
-}
-DECLARE_HOST_COMMAND(EC_CMD_USB_PD_CONTROL,
- hc_usb_pd_control,
- EC_VER_MASK(0) | EC_VER_MASK(1) | EC_VER_MASK(2));
static enum ec_status hc_remote_flash(struct host_cmd_handler_args *args)
{
@@ -1428,6 +1343,11 @@ void pd_request_vconn_swap_on(int port)
task_wake(PD_PORT_TO_TASK_ID(port));
}
}
+
+void pd_request_vconn_swap(int port)
+{
+ pe_dpm_request(port, DPM_REQUEST_VCONN_SWAP);
+}
#endif
#ifdef CONFIG_USBC_VCONN