diff options
-rw-r--r-- | common/usb_common.c | 6 | ||||
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 6 | ||||
-rw-r--r-- | include/usb_pd.h | 8 |
3 files changed, 17 insertions, 3 deletions
diff --git a/common/usb_common.c b/common/usb_common.c index 9a467ed96d..afd67bf0cd 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -548,6 +548,12 @@ __overridable void pd_execute_data_swap(int port, { } +__overridable enum pd_dual_role_states pd_get_drp_state_in_suspend(void) +{ + /* Disable dual role when going to suspend */ + return PD_DRP_TOGGLE_OFF; +} + __overridable void pd_try_execute_vconn_swap(int port, int flags) { /* diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index 4f1b29249f..b789191bb5 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -1342,7 +1342,7 @@ void tc_state_init(int port) if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) pd_set_dual_role_and_event(port, PD_DRP_FORCE_SINK, 0); else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) - pd_set_dual_role_and_event(port, PD_DRP_TOGGLE_OFF, 0); + pd_set_dual_role_and_event(port, pd_get_drp_state_in_suspend(), 0); else /* CHIPSET_STATE_ON */ pd_set_dual_role_and_event(port, PD_DRP_TOGGLE_ON, 0); @@ -3439,7 +3439,7 @@ static void pd_chipset_suspend(void) for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { pd_set_dual_role_and_event(i, - PD_DRP_TOGGLE_OFF, + pd_get_drp_state_in_suspend(), PD_EVENT_UPDATE_DUAL_ROLE | PD_EVENT_POWER_STATE_CHANGE); } @@ -3455,7 +3455,7 @@ static void pd_chipset_startup(void) for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { set_usb_mux_with_current_data_role(i); pd_set_dual_role_and_event(i, - PD_DRP_TOGGLE_OFF, + pd_get_drp_state_in_suspend(), PD_EVENT_UPDATE_DUAL_ROLE | PD_EVENT_POWER_STATE_CHANGE); /* diff --git a/include/usb_pd.h b/include/usb_pd.h index b546a286f4..e013779106 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -1572,6 +1572,14 @@ __override_proto void pd_execute_data_swap(int port, enum pd_data_role data_role); /** + * Get desired dual role state when chipset is suspended. + * Under some circumstances we are not allowed to be source + * during suspend. This function should return appropriate state. + */ + +__override_proto enum pd_dual_role_states pd_get_drp_state_in_suspend(void); + +/** * Get PD device info used for VDO_CMD_SEND_INFO / VDO_CMD_READ_INFO * * @param info_data pointer to info data array |