diff options
Diffstat (limited to 'common/usbc/usb_tc_drp_acc_trysrc_sm.c')
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 158 |
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 |