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: Rajmohan Mani <rajmohan.mani@intel.com> Reviewed-by: Prashant Malani <pmalani@chromium.org> Link: https://lore.kernel.org/r/20210205195113.20277-3-rajmohan.mani@intel.com Signed-off-by: Benson Leung <bleung@chromium.org>
This commit is contained in:
parent
38f56061c8
commit
b4b06c9772
@ -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,
|
|||||||
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,
|
|||||||
mux_flags);
|
mux_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mux_ack:
|
||||||
if (!typec->needs_mux_ack)
|
if (!typec->needs_mux_ack)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user