From 1524c164f52acc8cdab918b782c21e2120dcc5f6 Mon Sep 17 00:00:00 2001 From: Ting Shen Date: Mon, 29 Jul 2019 16:36:41 +0800 Subject: jacuzzi: enable DP enable dp on jacuzzi, and add back the dp implementation before CL:1660524 for all new devices including jacuzzi. usb_pd_policy now supports two different configs: - kukui/krane, rev <= 4: no mux (CONFIG_USB_MUX_VIRTUAL defined) - all new devices: have a real mux BUG=b:135895590,b:135079572 TEST=attach a usb hub and moniter to the dut, verify that dp/dp+mux mode and both polarities can detected correctly BRANCH=master Change-Id: I3e4757c97d555a4afb48076fc4785305c96b0a7f Signed-off-by: Ting Shen Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1723892 Reviewed-by: Ting Shen Commit-Queue: Ting Shen Tested-by: Ting Shen --- baseboard/kukui/baseboard.h | 1 - baseboard/kukui/usb_pd_policy.c | 28 +++++++++++++++++++++------- board/jacuzzi/board.c | 14 +++++--------- board/kodama/board.c | 11 ++++++++++- board/kukui/board.h | 1 + include/usb_pd.h | 1 + 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/baseboard/kukui/baseboard.h b/baseboard/kukui/baseboard.h index c1d99db39b..4b888fa5ac 100644 --- a/baseboard/kukui/baseboard.h +++ b/baseboard/kukui/baseboard.h @@ -130,7 +130,6 @@ #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM #define CONFIG_USB_CHARGER -#define CONFIG_USB_MUX_VIRTUAL /* Increase tx buffer size, as we'd like to stream EC log to AP. */ #undef CONFIG_UART_TX_BUF_SIZE diff --git a/baseboard/kukui/usb_pd_policy.c b/baseboard/kukui/usb_pd_policy.c index d6b5ddf764..5d5ca68e2d 100644 --- a/baseboard/kukui/usb_pd_policy.c +++ b/baseboard/kukui/usb_pd_policy.c @@ -250,10 +250,14 @@ static void svdm_safe_dp_mode(int port) static int svdm_enter_dp_mode(int port, uint32_t mode_caps) { - /* Kukui doesn't support superspeed lanes. */ - const uint32_t support_pin_mode = MODE_DP_PIN_C | MODE_DP_PIN_E; + /* Kukui/Krane doesn't support superspeed lanes. */ + const uint32_t support_pin_mode = IS_ENABLED(CONFIG_USB_MUX_VIRTUAL) ? + (MODE_DP_PIN_C | MODE_DP_PIN_E) : MODE_DP_PIN_ALL; - /* Only enter mode if device is DFP_D and PIN_C, PIN_E capable */ + /** + * Only enter mode if device is DFP_D (and PIN_C/E for Kukui/Krane) + * capable + */ if ((mode_caps & MODE_DP_SNK) && (mode_caps & (support_pin_mode << MODE_DP_DFP_PIN_SHIFT))) { svdm_safe_dp_mode(port); @@ -284,15 +288,25 @@ 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 status = dp_status[port]; + int mf_pref = PD_VDO_DPSTS_MF_PREF(dp_status[port]); + int pin_mode; + /* Kukui doesn't support multi-function mode, mask it out. */ - int status = dp_status[port] & ~PD_VDO_DPSTS_MF_MASK; - int pin_mode = pd_dfp_dp_get_pin_mode(port, status); + if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL)) + status &= ~PD_VDO_DPSTS_MF_MASK; + + pin_mode = pd_dfp_dp_get_pin_mode(port, status); if (!pin_mode) return 0; - usb_mux_set(port, TYPEC_MUX_DP, USB_SWITCH_CONNECT, - board_get_polarity(port)); + if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL)) + usb_mux_set(port, TYPEC_MUX_DP, USB_SWITCH_CONNECT, + board_get_polarity(port)); + else + usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP, + USB_SWITCH_CONNECT, board_get_polarity(port)); payload[0] = VDO(USB_SID_DISPLAYPORT, 1, CMD_DP_CONFIG | VDO_OPOS(opos)); diff --git a/board/jacuzzi/board.c b/board/jacuzzi/board.c index 6f2450b09d..3d23faea5f 100644 --- a/board/jacuzzi/board.c +++ b/board/jacuzzi/board.c @@ -107,15 +107,11 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { static void board_hpd_status(int port, int hpd_lvl, int hpd_irq) { - /* Invert HPD level since GPIOs are active low. */ - hpd_lvl = !hpd_lvl; - - gpio_set_level(GPIO_USB_C0_HPD_OD, hpd_lvl); - if (hpd_irq) { - gpio_set_level(GPIO_USB_C0_HPD_OD, 1); - msleep(1); - gpio_set_level(GPIO_USB_C0_HPD_OD, hpd_lvl); - } + /* + * svdm_dp_attention() did most of the work, we only need to notify + * host here. + */ + host_set_single_event(EC_HOST_EVENT_USB_MUX); } struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { diff --git a/board/kodama/board.c b/board/kodama/board.c index 1e778410cb..88f9042d4c 100644 --- a/board/kodama/board.c +++ b/board/kodama/board.c @@ -91,11 +91,20 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { }, }; +static void board_hpd_status(int port, int hpd_lvl, int hpd_irq) +{ + /* + * svdm_dp_attention() did most of the work, we only need to notify + * host here. + */ + host_set_single_event(EC_HOST_EVENT_USB_MUX); +} + struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { { .port_addr = IT5205_I2C_ADDR1_FLAGS, .driver = &it5205_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .hpd_update = &board_hpd_status, }, }; diff --git a/board/kukui/board.h b/board/kukui/board.h index c7d2da1ed9..b86b9d92bf 100644 --- a/board/kukui/board.h +++ b/board/kukui/board.h @@ -24,6 +24,7 @@ #include "baseboard.h" #define CONFIG_USB_MUX_IT5205 +#define CONFIG_USB_MUX_VIRTUAL #define CONFIG_VOLUME_BUTTONS /* Battery */ diff --git a/include/usb_pd.h b/include/usb_pd.h index a1a1c0ba0f..b0d52737f4 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -825,6 +825,7 @@ struct pd_cable { #define MODE_DP_PIN_D 0x08 #define MODE_DP_PIN_E 0x10 #define MODE_DP_PIN_F 0x20 +#define MODE_DP_PIN_ALL 0x3f #define MODE_DP_DFP_PIN_SHIFT 8 #define MODE_DP_UFP_PIN_SHIFT 16 -- cgit v1.2.1