summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2018-11-01 14:56:09 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-11-07 20:26:59 -0800
commitc1eee8c5f4a98877657aa9de9d616d3c0ab18544 (patch)
treee87120c53de8d44535517acefec443993906e25d
parent92e90175cd4c314099099957c296d26fea548e32 (diff)
downloadchrome-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>
-rw-r--r--board/cheza/usb_pd_policy.c20
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;
}