summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Zhong <zyw@rock-chips.com>2016-07-30 19:30:22 +0800
committerchrome-bot <chrome-bot@chromium.org>2016-08-02 14:29:37 -0700
commite46b2e393ac16e117bd1181c74438adab246da34 (patch)
tree4fd8b6bcdaa8f565c68143d903236dd1202ede13
parent3d7fe12257d4ae05b11ab247a798731daa395996 (diff)
downloadchrome-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.c23
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)