summaryrefslogtreecommitdiff
path: root/board/oak/usb_pd_policy.c
diff options
context:
space:
mode:
authorRong Chang <rongchang@chromium.org>2015-06-11 20:38:21 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-06-17 20:24:18 +0000
commitdd1987051b473e74dab3490921d0cc77c76fcac3 (patch)
tree0e4f28d2302d3dfc33b67082139ef814068a43c3 /board/oak/usb_pd_policy.c
parent4982391dc27960c5af4e1814d627154a8aac3e29 (diff)
downloadchrome-ec-dd1987051b473e74dab3490921d0cc77c76fcac3.tar.gz
oak: enable USBC superspeed mux
This change enables USB3/DP superspeed mux. Oak's two type-C ports share one DP hardware. When both ports connect to DP output device, only the first DP signal will be routed to SoC. On exit dp mode, oak sends HPD again if the other port's DP flag is on. BRANCH=none BUG=chrome-os-partner:41404 TEST=none Change-Id: I7eebc0b2354f93d7421bf83796294a6b2acf4c3b Signed-off-by: Rong Chang <rongchang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/277000 Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'board/oak/usb_pd_policy.c')
-rw-r--r--board/oak/usb_pd_policy.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/board/oak/usb_pd_policy.c b/board/oak/usb_pd_policy.c
index cc7abc60d6..10665c08e9 100644
--- a/board/oak/usb_pd_policy.c
+++ b/board/oak/usb_pd_policy.c
@@ -234,7 +234,8 @@ static void svdm_safe_dp_mode(int port)
{
/* make DP interface safe until configure */
dp_flags[port] = 0;
- /* board_set_usb_mux(port, TYPEC_MUX_NONE, pd_get_polarity(port)); */
+ board_set_usb_mux(port, TYPEC_MUX_NONE,
+ USB_SWITCH_CONNECT, pd_get_polarity(port));
}
static int svdm_enter_dp_mode(int port, uint32_t mode_caps)
@@ -267,7 +268,8 @@ 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);
- /* board_set_usb_mux(port, TYPEC_MUX_DP, pd_get_polarity(port)); */
+ board_set_usb_mux(port, 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(MODE_DP_PIN_E, /* pin mode */
@@ -281,10 +283,32 @@ static void svdm_dp_post_config(int port)
dp_flags[port] |= DP_FLAGS_DP_ON;
if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING))
return;
+ board_typec_dp_set(port, 1);
}
static int svdm_dp_attention(int port, uint32_t *payload)
{
+ int cur_lvl;
+ int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]);
+ int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]);
+
+ cur_lvl = gpio_get_level(GPIO_USB_DP_HPD);
+
+ /* Its initial DP status message prior to config */
+ if (!(dp_flags[port] & DP_FLAGS_DP_ON)) {
+ if (lvl)
+ dp_flags[port] |= DP_FLAGS_HPD_HI_PENDING;
+ return 1;
+ }
+
+ if (irq & cur_lvl) {
+ board_typec_dp_on(port);
+ } else if (irq & !cur_lvl) {
+ CPRINTF("ERR:HPD:IRQ&LOW\n");
+ return 0; /* nak */
+ } else {
+ board_typec_dp_set(port, lvl);
+ }
/* ack */
return 1;
}
@@ -292,7 +316,7 @@ static int svdm_dp_attention(int port, uint32_t *payload)
static void svdm_exit_dp_mode(int port)
{
svdm_safe_dp_mode(port);
- /* gpio_set_level(PORT_TO_HPD(port), 0); */
+ board_typec_dp_off(port, dp_flags);
}
static int svdm_enter_gfu_mode(int port, uint32_t mode_caps)