summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)