Commit b4b06c97 authored by Rajmohan Mani's avatar Rajmohan Mani Committed by Benson Leung

platform/chrome: cros_ec_types: Support disconnect events without partners

There are certain scenarios, where a disconnect event might
occur on a Type-C port with no port partners. This is required
to enable communication to Burnside Bridge USB4 retimers.
Signed-off-by: default avatarRajmohan Mani <rajmohan.mani@intel.com>
Reviewed-by: default avatarPrashant Malani <pmalani@chromium.org>
Link: https://lore.kernel.org/r/20210205195113.20277-3-rajmohan.mani@intel.comSigned-off-by: default avatarBenson Leung <bleung@chromium.org>
parent 38f56061
...@@ -203,20 +203,26 @@ static void cros_typec_unregister_altmodes(struct cros_typec_data *typec, int po ...@@ -203,20 +203,26 @@ static void cros_typec_unregister_altmodes(struct cros_typec_data *typec, int po
} }
} }
static void cros_typec_remove_partner(struct cros_typec_data *typec, static int cros_typec_usb_disconnect_state(struct cros_typec_port *port)
int port_num)
{ {
struct cros_typec_port *port = typec->ports[port_num];
cros_typec_unregister_altmodes(typec, port_num, true);
port->state.alt = NULL; port->state.alt = NULL;
port->state.mode = TYPEC_STATE_USB; port->state.mode = TYPEC_STATE_USB;
port->state.data = NULL; port->state.data = NULL;
usb_role_switch_set_role(port->role_sw, USB_ROLE_NONE); usb_role_switch_set_role(port->role_sw, USB_ROLE_NONE);
typec_switch_set(port->ori_sw, TYPEC_ORIENTATION_NONE); typec_switch_set(port->ori_sw, TYPEC_ORIENTATION_NONE);
typec_mux_set(port->mux, &port->state);
return typec_mux_set(port->mux, &port->state);
}
static void cros_typec_remove_partner(struct cros_typec_data *typec,
int port_num)
{
struct cros_typec_port *port = typec->ports[port_num];
cros_typec_unregister_altmodes(typec, port_num, true);
cros_typec_usb_disconnect_state(port);
typec_unregister_partner(port->partner); typec_unregister_partner(port->partner);
port->partner = NULL; port->partner = NULL;
...@@ -536,6 +542,11 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num, ...@@ -536,6 +542,11 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
enum typec_orientation orientation; enum typec_orientation orientation;
int ret; int ret;
if (mux_flags == USB_PD_MUX_NONE) {
ret = cros_typec_usb_disconnect_state(port);
goto mux_ack;
}
if (mux_flags & USB_PD_MUX_POLARITY_INVERTED) if (mux_flags & USB_PD_MUX_POLARITY_INVERTED)
orientation = TYPEC_ORIENTATION_REVERSE; orientation = TYPEC_ORIENTATION_REVERSE;
else else
...@@ -569,6 +580,7 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num, ...@@ -569,6 +580,7 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
mux_flags); mux_flags);
} }
mux_ack:
if (!typec->needs_mux_ack) if (!typec->needs_mux_ack)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment