diff options
author | Wai-Hong Tam <waihong@google.com> | 2018-11-01 14:56:09 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-11-07 20:26:59 -0800 |
commit | c1eee8c5f4a98877657aa9de9d616d3c0ab18544 (patch) | |
tree | e87120c53de8d44535517acefec443993906e25d /board/cheza | |
parent | 92e90175cd4c314099099957c296d26fea548e32 (diff) | |
download | chrome-ec-c1eee8c5f4a98877657aa9de9d616d3c0ab18544.tar.gz |
cheza: Don't mux the DP lines until HPD level goes high
There is no dedicated GPIO in the SoC to HPD detection. To follow
the previous design, the DP PHY should be powered on/off using the
EXTCON_DISP_DP cable state. The EXTCON_DISP_DP cable state is set
iff the DP mux is enabled. So EC should not enable the DP mux until
the HPD level goes high. The hpd_update() is used for HPD_IRQ only.
BRANCH=none
BUG=b:118838389
TEST=Plugged a USB-C hub with HDMI port to port-0. Checked:
> typec 0
Port C0: polarity:CC1
Superspeed USB1
TEST=Plugged a HDMI monitor cable to the above hub. Checked:
> typec 0
Port C0: polarity:CC1
Superspeed DP1+USB1
TEST=Unplugged the HDMI monitor cable. Checked:
> typec 0
Port C0: polarity:CC1
Superspeed USB1
TEST=Plugged a USB-C to HDMI dongle to port-0. Checked:
> typec 0
Port C0: polarity:CC1
No Superspeed connection
TEST=Plugged a HDMI monitor cable to the above dongle. Checked:
> typec 0
Port C0: polarity:CC1
Superspeed DP1
TEST=Unplugged the HDMI monitor cable. Checked:
> typec 0
Port C0: polarity:CC1
No Superspeed connection
Change-Id: I9d3ac705913dd1829931def0e4c141da13fbc07c
Signed-off-by: Wai-Hong Tam <waihong@google.com>
Reviewed-on: https://chromium-review.googlesource.com/1313472
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Diffstat (limited to 'board/cheza')
-rw-r--r-- | board/cheza/usb_pd_policy.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/board/cheza/usb_pd_policy.c b/board/cheza/usb_pd_policy.c index 8b7b407c09..fc95621c3d 100644 --- a/board/cheza/usb_pd_policy.c +++ b/board/cheza/usb_pd_policy.c @@ -277,7 +277,7 @@ static void svdm_safe_dp_mode(int port) dp_flags[port] = 0; dp_status[port] = 0; usb_mux_set(port, TYPEC_MUX_NONE, - USB_SWITCH_CONNECT, pd_get_polarity(port)); + USB_SWITCH_CONNECT, pd_get_polarity(port)); } static int svdm_enter_dp_mode(int port, uint32_t mode_caps) @@ -311,15 +311,11 @@ static int svdm_dp_status(int port, uint32_t *payload) static int svdm_dp_config(int port, uint32_t *payload) { int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT); - int mf_pref = PD_VDO_DPSTS_MF_PREF(dp_status[port]); int pin_mode = pd_dfp_dp_get_pin_mode(port, dp_status[port]); if (!pin_mode) return 0; - usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP, - USB_SWITCH_CONNECT, pd_get_polarity(port)); - payload[0] = VDO(USB_SID_DISPLAYPORT, 1, CMD_DP_CONFIG | VDO_OPOS(opos)); payload[1] = VDO_DP_CFG(pin_mode, /* pin mode */ @@ -330,18 +326,14 @@ static int svdm_dp_config(int port, uint32_t *payload) static void svdm_dp_post_config(int port) { - const struct usb_mux *mux = &usb_muxes[port]; - dp_flags[port] |= DP_FLAGS_DP_ON; - if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING)) - return; - mux->hpd_update(port, 1, 0); } static int svdm_dp_attention(int port, uint32_t *payload) { int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]); + int mf_pref = PD_VDO_DPSTS_MF_PREF(payload[1]); const struct usb_mux *mux = &usb_muxes[port]; dp_status[port] = payload[1]; @@ -350,8 +342,16 @@ static int svdm_dp_attention(int port, uint32_t *payload) dp_flags[port] |= DP_FLAGS_HPD_HI_PENDING; return 1; } + mux->hpd_update(port, lvl, irq); + if (lvl) + usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP, + USB_SWITCH_CONNECT, pd_get_polarity(port)); + else + usb_mux_set(port, mf_pref ? TYPEC_MUX_USB : TYPEC_MUX_NONE, + USB_SWITCH_CONNECT, pd_get_polarity(port)); + /* ack */ return 1; } |