summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-06-22 18:09:35 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-06-24 17:23:16 -0700
commitf35e7b923b5b05b4a5985fabcfe1ecef07b806c9 (patch)
treeb6a64a2bac1bbb533f8530b1a2d950e90e5af8a3
parent203063609b52f4125ee91c474cf5f58178572050 (diff)
downloadchrome-ec-f35e7b923b5b05b4a5985fabcfe1ecef07b806c9.tar.gz
kevin / gru: Enable host-controlled USB-C SS mux
BUG=chrome-os-partner:52639 BRANCH=None TEST=Manual on gru with subsequent commit. Attach USB dongle in port 1 and DP dongle in port 0, then verify `ectool usbpdmuxinfo` output: Port 0: DP Port 1: USB Flip DP dongle and verify output changes: Port 0: DP INV Change-Id: I5459cb587badd46c03d1c433f13fdf21a5dc63ed Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/355282 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/kevin/board.c22
-rw-r--r--board/kevin/board.h5
-rw-r--r--board/kevin/usb_pd_policy.c15
3 files changed, 26 insertions, 16 deletions
diff --git a/board/kevin/board.c b/board/kevin/board.c
index 32255b8ace..dd6daee24d 100644
--- a/board/kevin/board.c
+++ b/board/kevin/board.c
@@ -38,6 +38,7 @@
#include "timer.h"
#include "thermal.h"
#include "usb_charge.h"
+#include "usb_mux.h"
#include "usb_pd_tcpm.h"
#include "util.h"
@@ -164,6 +165,17 @@ static const enum bd99955_charge_port
[1] = BD99955_CHARGE_PORT_VCC,
};
+struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = {
+ {
+ .port_addr = 0,
+ .driver = &virtual_usb_mux_driver,
+ },
+ {
+ .port_addr = 1,
+ .driver = &virtual_usb_mux_driver,
+ },
+};
+
void board_reset_pd_mcu(void)
{
}
@@ -234,16 +246,6 @@ int pd_snk_is_vbus_provided(int port)
static void board_init(void)
{
- int i;
-
- /*
- * Connect USB data switches.
- * TODO(crosbug.com/p/52639): Synchronize switch open / close with
- * USB mux control.
- */
- for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; ++i)
- usb_charger_set_switches(i, USB_SWITCH_CONNECT);
-
/* Enable charger interrupt for BC1.2 detection on attach / detach */
gpio_enable_interrupt(GPIO_CHARGER_INT_L);
diff --git a/board/kevin/board.h b/board/kevin/board.h
index f04d1366c3..1a5f7a75af 100644
--- a/board/kevin/board.h
+++ b/board/kevin/board.h
@@ -53,6 +53,7 @@
#define CONFIG_CHARGER_NARROW_VDC
#define CONFIG_CHARGER_V2
#define CONFIG_USB_CHARGER
+#define CONFIG_USB_MUX_VIRTUAL
/* Motion Sensors */
#define CONFIG_ACCEL_BMA255
@@ -77,6 +78,9 @@
#define CONFIG_USB_PD_VBUS_DETECT_CHARGER
/* TODO: Enable TRY_SRC */
#undef CONFIG_USB_PD_TRY_SRC
+#define CONFIG_USBC_SS_MUX
+#define CONFIG_USBC_VCONN
+#define CONFIG_USBC_VCONN_SWAP
#define CONFIG_BATTERY_CUT_OFF
#define CONFIG_BATTERY_PRESENT_GPIO GPIO_EC_BATT_PRES_L
@@ -90,6 +94,7 @@
/* TODO: determine the following board specific type-C power constants */
#define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */
#define PD_POWER_SUPPLY_TURN_OFF_DELAY 250000 /* us */
+#define PD_VCONN_SWAP_DELAY 5000 /* us */
/* start as a sink in case we have no other power supply/battery */
#define PD_DEFAULT_STATE PD_STATE_SNK_DISCONNECTED
diff --git a/board/kevin/usb_pd_policy.c b/board/kevin/usb_pd_policy.c
index a631df6313..94b48b37d6 100644
--- a/board/kevin/usb_pd_policy.c
+++ b/board/kevin/usb_pd_policy.c
@@ -208,7 +208,7 @@ int pd_custom_vdm(int port, int cnt, uint32_t *payload,
CPRINTF("Current: %dmA\n", payload[1]);
break;
case VDO_CMD_FLIP:
- /* usb_mux_flip(port); */
+ usb_mux_flip(port);
break;
#ifdef CONFIG_USB_PD_LOGGING
case VDO_CMD_GET_LOG:
@@ -230,8 +230,8 @@ static void svdm_safe_dp_mode(int port)
/* make DP interface safe until configure */
dp_flags[port] = 0;
dp_status[port] = 0;
- /* usb_mux_set(port, TYPEC_MUX_NONE,
- USB_SWITCH_CONNECT, pd_get_polarity(port)); */
+ usb_mux_set(port, TYPEC_MUX_NONE,
+ USB_SWITCH_CONNECT, pd_get_polarity(port));
}
static int svdm_enter_dp_mode(int port, uint32_t mode_caps)
@@ -265,14 +265,14 @@ 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 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)); */
+ 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));
@@ -285,6 +285,9 @@ 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;
}
static int svdm_dp_attention(int port, uint32_t *payload)