diff options
-rw-r--r-- | common/usb_common.c | 11 | ||||
-rw-r--r-- | common/usb_pd_alt_mode_dfp.c | 2 | ||||
-rw-r--r-- | common/usbc/dp_alt_mode.c | 3 | ||||
-rw-r--r-- | common/usbc/tbt_alt_mode.c | 9 | ||||
-rw-r--r-- | include/usb_common.h | 11 |
5 files changed, 32 insertions, 4 deletions
diff --git a/common/usb_common.c b/common/usb_common.c index 81e9d2f24f..7005e4a8b0 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -470,6 +470,17 @@ void usb_mux_set_safe_mode(int port) ppc_set_sbu(port, 0); } +void usb_mux_set_safe_mode_exit(int port) +{ + if (IS_ENABLED(CONFIG_USBC_SS_MUX)) + usb_mux_set(port, USB_PD_MUX_NONE, USB_SWITCH_CONNECT, + polarity_rm_dts(pd_get_polarity(port))); + + /* Isolate the SBU lines. */ + if (IS_ENABLED(CONFIG_USBC_PPC_SBU)) + ppc_set_sbu(port, 0); +} + static void pd_send_hard_reset(int port) { task_set_event(PD_PORT_TO_TASK_ID(port), PD_EVENT_SEND_HARD_RESET); diff --git a/common/usb_pd_alt_mode_dfp.c b/common/usb_pd_alt_mode_dfp.c index e3964d4ca7..3c9a641490 100644 --- a/common/usb_pd_alt_mode_dfp.c +++ b/common/usb_pd_alt_mode_dfp.c @@ -1232,6 +1232,8 @@ __overridable int svdm_dp_attention(int port, uint32_t *payload) __overridable void svdm_exit_dp_mode(int port) { + dp_flags[port] = 0; + dp_status[port] = 0; #ifdef CONFIG_USB_PD_DP_HPD_GPIO svdm_set_hpd_gpio(port, 0); #endif /* CONFIG_USB_PD_DP_HPD_GPIO */ diff --git a/common/usbc/dp_alt_mode.c b/common/usbc/dp_alt_mode.c index af5db7263b..8e22c23170 100644 --- a/common/usbc/dp_alt_mode.c +++ b/common/usbc/dp_alt_mode.c @@ -261,7 +261,8 @@ int dp_setup_next_vdm(int port, int vdo_count, uint32_t *vdm) if (!(modep && modep->opos)) return -1; - svdm_safe_dp_mode(port); + usb_mux_set_safe_mode_exit(port); + vdm[0] = VDO(USB_SID_DISPLAYPORT, 1, /* structured */ CMD_EXIT_MODE); diff --git a/common/usbc/tbt_alt_mode.c b/common/usbc/tbt_alt_mode.c index 72a633c451..793de4c778 100644 --- a/common/usbc/tbt_alt_mode.c +++ b/common/usbc/tbt_alt_mode.c @@ -488,7 +488,8 @@ int tbt_setup_next_vdm(int port, int vdo_count, uint32_t *vdm, if (!(modep && modep->opos)) return -1; - usb_mux_set_safe_mode(port); + usb_mux_set_safe_mode_exit(port); + vdm[0] = VDO(USB_VID_INTEL, 1, CMD_EXIT_MODE) | VDO_OPOS(modep->opos) | VDO_CMDT(CMDT_INIT) | @@ -502,7 +503,8 @@ int tbt_setup_next_vdm(int port, int vdo_count, uint32_t *vdm, if (!(modep && modep->opos)) return -1; - usb_mux_set_safe_mode(port); + usb_mux_set_safe_mode_exit(port); + vdm[0] = VDO(USB_VID_INTEL, 1, CMD_EXIT_MODE) | VDO_OPOS(modep->opos) | VDO_CMDT(CMDT_INIT) | @@ -517,7 +519,8 @@ int tbt_setup_next_vdm(int port, int vdo_count, uint32_t *vdm, if (!(modep && modep->opos)) return -1; - usb_mux_set_safe_mode(port); + usb_mux_set_safe_mode_exit(port); + vdm[0] = VDO(USB_VID_INTEL, 1, CMD_EXIT_MODE) | VDO_OPOS(modep->opos) | VDO_CMDT(CMDT_INIT) | diff --git a/include/usb_common.h b/include/usb_common.h index 526143138a..00440390df 100644 --- a/include/usb_common.h +++ b/include/usb_common.h @@ -174,6 +174,17 @@ void set_usb_mux_with_current_data_role(int port); void usb_mux_set_safe_mode(int port); /** + * Configure the USB MUX in safe mode while exiting an alternate mode. + * Although the TCSS (virtual mux) has a distinct safe mode state, it + * needs to be in a disconnected state to properly exit an alternate + * mode. Therefore, do not treat the virtual mux as a special case, as + * usb_mux_set_safe_mode does. + * + * @param port The PD port number + */ +void usb_mux_set_safe_mode_exit(int port); + +/** * Get the PD flags stored in BB Ram * * @param port USB-C port number |