diff options
-rw-r--r-- | board/kevin/board.c | 22 | ||||
-rw-r--r-- | board/kevin/board.h | 5 | ||||
-rw-r--r-- | board/kevin/usb_pd_policy.c | 15 |
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) |