diff options
author | Ruibin Chang <Ruibin.Chang@ite.com.tw> | 2019-05-21 15:25:44 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-23 10:39:40 -0700 |
commit | 30258567e5e4cdb50f4a9238b27f6ad1b064bd65 (patch) | |
tree | 56b5fac16266978bb1d6306145353a5eb1699828 | |
parent | b21a483544fc07bec8f9230bf4048bbadb7df4d6 (diff) | |
download | chrome-ec-stabilize-12222.B.tar.gz |
usb/mux: Do not connect MUX when PD disconnectedstabilize-12222.B
When chipset power up to S5->S3 state set PD_EVENT_POWER_STATE_CHANGE,
pd task set mux usb mode whether c-port is attached or not.
If c-port is nothing attached at the setting moment,
then mux detects nothing and goes to low power state.
Plug-in type-c usb device, after debounce pass, we set mux usb
mode and mux responds i2C NAK (due to in low power mode).
This CL changes that do not connect MUX when PD disconnected.
For example ps8751 is used for mux case. When power up(S5->S3),
we should set mux none mode whether c-port is attached or not.
Once type-c usb device plug-in, after cc debounce pass, we
will set mux usb mode in X_DEBOUNCE_DISCONNECT state.
BRANCH=None
BUG=b:133196882
TEST=After console cmd reboot and reboot hard,
type-c usb device plug-in on ampton and
get type-c port status by "ectool usbpdmuxinfo".
Change-Id: Ia538af48c450e12af1438a6aa9a6e4e426e2f616
Signed-off-by: Ruibin Chang <Ruibin.Chang@ite.com.tw>
Reviewed-on: https://chromium-review.googlesource.com/1609262
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r-- | common/usb_pd_protocol.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index efa196925e..04b3b5223b 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1243,6 +1243,15 @@ static void handle_vdm_request(int port, int cnt, uint32_t *payload) port, PD_VDO_VID(payload[0]), payload[0] & 0xFFFF); } +static __maybe_unused int pd_is_disconnected(int port) +{ + return pd[port].task_state == PD_STATE_SRC_DISCONNECTED +#ifdef CONFIG_USB_PD_DUAL_ROLE + || pd[port].task_state == PD_STATE_SNK_DISCONNECTED +#endif + ; +} + static void set_usb_mux_with_current_data_role(int port) { #ifdef CONFIG_USBC_SS_MUX @@ -1258,21 +1267,29 @@ static void set_usb_mux_with_current_data_role(int port) } #endif /* CONFIG_POWER_COMMON */ -#ifdef CONFIG_USBC_SS_MUX_DFP_ONLY /* - * Need to connect SS mux for if new data role is DFP. - * If new data role is UFP, then disconnect the SS mux. + * When PD stack is disconnected, then mux should be disconnected, which + * is also what happens in the set_state disconnection code. Once the + * PD state machine progresses out of disconnect, the MUX state will + * be set correctly again. */ - if (pd[port].data_role == PD_ROLE_DFP) - usb_mux_set(port, TYPEC_MUX_USB, USB_SWITCH_CONNECT, + if (pd_is_disconnected(port)) + usb_mux_set(port, TYPEC_MUX_NONE, USB_SWITCH_DISCONNECT, pd[port].polarity); - else + /* + * If new data role isn't DFP and we only support DFP, also disconnect. + */ + else if (IS_ENABLED(CONFIG_USBC_SS_MUX_DFP_ONLY) && + pd[port].data_role != PD_ROLE_DFP) usb_mux_set(port, TYPEC_MUX_NONE, USB_SWITCH_DISCONNECT, pd[port].polarity); -#else - usb_mux_set(port, TYPEC_MUX_USB, USB_SWITCH_CONNECT, - pd[port].polarity); -#endif /* CONFIG_USBC_SS_MUX_DFP_ONLY */ + /* + * Otherwise connect mux since we are in S3+ + */ + else + usb_mux_set(port, TYPEC_MUX_USB, USB_SWITCH_CONNECT, + pd[port].polarity); + #endif /* CONFIG_USBC_SS_MUX */ } |