/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright 2015-2017 Google, Inc * Copyright 2024 Collabora */ #ifndef __LINUX_USB_TCPM_INTERNAL_H #define __LINUX_USB_TCPM_INTERNAL_H #define FOREACH_TCPM_STATE(S) \ S(INVALID_STATE), \ S(TOGGLING), \ S(SRC_UNATTACHED), \ S(SRC_ATTACH_WAIT), \ S(SRC_ATTACHED), \ S(SRC_STARTUP), \ S(SRC_SEND_CAPABILITIES), \ S(SRC_SEND_CAPABILITIES_TIMEOUT), \ S(SRC_NEGOTIATE_CAPABILITIES), \ S(SRC_TRANSITION_SUPPLY), \ S(SRC_READY), \ S(SRC_WAIT_NEW_CAPABILITIES), \ \ S(SNK_UNATTACHED), \ S(SNK_ATTACH_WAIT), \ S(SNK_DEBOUNCED), \ S(SNK_ATTACHED), \ S(SNK_STARTUP), \ S(SNK_DISCOVERY), \ S(SNK_DISCOVERY_DEBOUNCE), \ S(SNK_DISCOVERY_DEBOUNCE_DONE), \ S(SNK_WAIT_CAPABILITIES), \ S(SNK_NEGOTIATE_CAPABILITIES), \ S(SNK_TRANSITION_SINK), \ S(SNK_TRANSITION_SINK_VBUS), \ S(SNK_READY), \ \ S(HARD_RESET_SEND), \ S(HARD_RESET_START), \ S(SRC_HARD_RESET_VBUS_OFF), \ S(SRC_HARD_RESET_VBUS_ON), \ S(SNK_HARD_RESET_SINK_OFF), \ S(SNK_HARD_RESET_WAIT_VBUS), \ S(SNK_HARD_RESET_SINK_ON), \ \ S(SOFT_RESET), \ S(SOFT_RESET_SEND), \ \ S(DR_SWAP_ACCEPT), \ S(DR_SWAP_CHANGE_DR), \ \ S(ERROR_RECOVERY), \ S(PORT_RESET), \ S(PORT_RESET_WAIT_OFF) #define GENERATE_TCPM_ENUM(e) e #define GENERATE_TCPM_STRING(s) #s #define TCPM_POLL_EVENT_TIME_OUT 2000 enum tcpm_state { FOREACH_TCPM_STATE(GENERATE_TCPM_ENUM) }; enum pd_msg_request { PD_MSG_NONE = 0, PD_MSG_CTRL_REJECT, PD_MSG_CTRL_WAIT, PD_MSG_CTRL_NOT_SUPP, PD_MSG_DATA_SINK_CAP, PD_MSG_DATA_SOURCE_CAP, }; struct tcpm_port { enum typec_port_type typec_type; int typec_prefer_role; enum typec_role vconn_role; enum typec_role pwr_role; enum typec_data_role data_role; struct typec_partner *partner; enum typec_cc_status cc_req; enum typec_cc_status cc1; enum typec_cc_status cc2; enum typec_cc_polarity polarity; bool attached; bool connected; int poll_event_cnt; enum typec_port_type port_type; /* * Set to true when vbus is greater than VSAFE5V min. * Set to false when vbus falls below vSinkDisconnect max threshold. */ bool vbus_present; /* * Set to true when vbus is less than VSAFE0V max. * Set to false when vbus is greater than VSAFE0V max. */ bool vbus_vsafe0v; bool vbus_never_low; bool vbus_source; bool vbus_charge; int try_role; enum pd_msg_request queued_message; enum tcpm_state enter_state; enum tcpm_state prev_state; enum tcpm_state state; enum tcpm_state delayed_state; unsigned long delay_ms; bool state_machine_running; bool tx_complete; enum tcpm_transmit_status tx_status; unsigned int negotiated_rev; unsigned int message_id; unsigned int caps_count; unsigned int hard_reset_count; bool pd_capable; bool explicit_contract; unsigned int rx_msgid; /* Partner capabilities/requests */ u32 sink_request; u32 source_caps[PDO_MAX_OBJECTS]; unsigned int nr_source_caps; u32 sink_caps[PDO_MAX_OBJECTS]; unsigned int nr_sink_caps; /* * whether to wait for the Type-C device to send the DR_SWAP Message flag * For Type-C device with Dual-Role Power and Dual-Role Data, the port side * is used as sink + ufp, then the tcpm framework needs to wait for Type-C * device to initiate DR_swap Message. */ bool wait_dr_swap_message; /* Local capabilities */ u32 src_pdo[PDO_MAX_OBJECTS]; unsigned int nr_src_pdo; u32 snk_pdo[PDO_MAX_OBJECTS]; unsigned int nr_snk_pdo; unsigned int operating_snk_mw; bool update_sink_caps; /* Requested current / voltage to the port partner */ u32 req_current_limit; u32 req_supply_voltage; /* Actual current / voltage limit of the local port */ u32 current_limit; u32 supply_voltage; /* port belongs to a self powered device */ bool self_powered; unsigned long delay_target; }; extern const char * const tcpm_states[]; int tcpm_post_probe(struct udevice *dev); #endif