diff options
author | Chris Zhong <zyw@rock-chips.com> | 2016-07-30 19:30:22 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-08-02 14:29:37 -0700 |
commit | e46b2e393ac16e117bd1181c74438adab246da34 (patch) | |
tree | 4fd8b6bcdaa8f565c68143d903236dd1202ede13 | |
parent | 3d7fe12257d4ae05b11ab247a798731daa395996 (diff) | |
download | chrome-ec-e46b2e393ac16e117bd1181c74438adab246da34.tar.gz |
Kevin: support DP hot-plug
The kernel DP driver do not support hpd gpio detect, it use
EXTCON_DISP_DP cable state to decide power on/off DP PHY. Hence, do not
change GPIO_USB_DP_HPD level, but set or clear the TYPEC_MUX_DP when hpd
level changing in attention.
BUG=chrome-os-partner:52872
BRANCH=none
TEST=keep Type-C Dock inserted
1. plug HDMI cable, check with "ectool usbpdmuxinfo"
Port 0: USB DP
2. unplug HDMI cable, check with "ectool usbpdmuxinfo"
Port 0: USB
Change-Id: I369a92135bf0ca177e81eab6385980d51d863172
Signed-off-by: Chris Zhong <zyw@rock-chips.com>
Reviewed-on: https://chromium-review.googlesource.com/364401
Commit-Ready: Guenter Roeck <groeck@chromium.org>
Tested-by: Guenter Roeck <groeck@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r-- | board/kevin/usb_pd_policy.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/board/kevin/usb_pd_policy.c b/board/kevin/usb_pd_policy.c index ca3aa12337..7909923494 100644 --- a/board/kevin/usb_pd_policy.c +++ b/board/kevin/usb_pd_policy.c @@ -232,6 +232,7 @@ static void svdm_safe_dp_mode(int port) dp_status[port] = 0; usb_mux_set(port, TYPEC_MUX_NONE, USB_SWITCH_CONNECT, pd_get_polarity(port)); + gpio_set_level(GPIO_USB_DP_HPD, 0); } static int svdm_enter_dp_mode(int port, uint32_t mode_caps) @@ -265,15 +266,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 */ @@ -284,7 +281,6 @@ static int svdm_dp_config(int port, uint32_t *payload) static void svdm_dp_post_config(int port) { - /* TODO: Figure out HPD */ dp_flags[port] |= DP_FLAGS_DP_ON; if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING)) return; @@ -292,13 +288,26 @@ static void svdm_dp_post_config(int port) static int svdm_dp_attention(int port, uint32_t *payload) { - /* TODO: Figure out HPD */ + int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); + int mf_pref = PD_VDO_DPSTS_MF_PREF(payload[1]); + + dp_status[port] = payload[1]; + + 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)); + + gpio_set_level(GPIO_USB_DP_HPD, lvl); + return 1; } static void svdm_exit_dp_mode(int port) { - /* TODO: Figure out HPD */ + svdm_safe_dp_mode(port); } static int svdm_enter_gfu_mode(int port, uint32_t mode_caps) |