From 5094437e865bb00c672288b5420b3a257c14d236 Mon Sep 17 00:00:00 2001 From: Ting Shen Date: Thu, 5 Sep 2019 01:20:19 +0800 Subject: krane: add it5205 driver An it5205 is added in kukui/krane rev 5, and deprecated gpio pin USB_C0_DP_OE_L and USB_C0_DP_POLARITY. This CL is intended to make the fw works for both old and new boards: 1) the default usb_mux driver is updated to rev 5, and board_rev_init may change it back for old boards. 2) keep VARIANT_KUKUI_DP_MUX_GPIO in kukui/board.h, and add a customized function to set/clear these gpio pins. BUG=b:135079572 TEST=verify that type c display works on board rev 4/5 BRANCH=master Change-Id: Ibe28816eed026ccb8a9a5234a612f80b038884f1 Signed-off-by: Ting Shen Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1785197 Reviewed-by: Yilun Lin Commit-Queue: Ting Shen Tested-by: Ting Shen --- baseboard/kukui/baseboard.h | 8 ++++++++ baseboard/kukui/usb_pd_policy.c | 13 ++++--------- board/kukui/board.c | 32 ++++++++++++++++++++++++++++++-- board/kukui/board.h | 2 ++ board/kukui/gpio.inc | 5 +++-- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/baseboard/kukui/baseboard.h b/baseboard/kukui/baseboard.h index b22b1cdf01..c1d99db39b 100644 --- a/baseboard/kukui/baseboard.h +++ b/baseboard/kukui/baseboard.h @@ -56,6 +56,8 @@ * Define this flag if board controls dp mux via gpio pins USB_C0_DP_OE_L and * USB_C0_DP_POLARITY. * + * board must provide function board_set_dp_mux_control(output_enable, polarity) + * * #define VARIANT_KUKUI_DP_MUX_GPIO */ @@ -219,4 +221,10 @@ #define CONFIG_MKBP_EVENT #define CONFIG_MKBP_USE_GPIO +#ifndef __ASSEMBLER__ +#ifdef VARIANT_KUKUI_DP_MUX_GPIO +void board_set_dp_mux_control(int output_enable, int polarity); +#endif /* VARIANT_KUKUI_DP_MUX_GPIO */ +#endif /* !__ASSEMBLER__ */ + #endif /* __CROS_EC_BASEBOARD_H */ diff --git a/baseboard/kukui/usb_pd_policy.c b/baseboard/kukui/usb_pd_policy.c index 95ed4290b7..d6b5ddf764 100644 --- a/baseboard/kukui/usb_pd_policy.c +++ b/baseboard/kukui/usb_pd_policy.c @@ -318,8 +318,7 @@ static void svdm_dp_post_config(int port) gpio_set_level(GPIO_USB_C0_HPD_OD, 1); #ifdef VARIANT_KUKUI_DP_MUX_GPIO - gpio_set_level(GPIO_USB_C0_DP_OE_L, 0); - gpio_set_level(GPIO_USB_C0_DP_POLARITY, board_get_polarity(port)); + board_set_dp_mux_control(1, board_get_polarity(port)); #endif /* set the minimum time delay (2ms) for the next HPD IRQ */ @@ -357,9 +356,7 @@ static int svdm_dp_attention(int port, uint32_t *payload) gpio_set_level(GPIO_USB_C0_HPD_OD, 1); #ifdef VARIANT_KUKUI_DP_MUX_GPIO - gpio_set_level(GPIO_USB_C0_DP_OE_L, 0); - gpio_set_level(GPIO_USB_C0_DP_POLARITY, - board_get_polarity(port)); + board_set_dp_mux_control(1, board_get_polarity(port)); #endif /* set the minimum time delay (2ms) for the next HPD IRQ */ @@ -370,9 +367,7 @@ static int svdm_dp_attention(int port, uint32_t *payload) } else { gpio_set_level(GPIO_USB_C0_HPD_OD, lvl); #ifdef VARIANT_KUKUI_DP_MUX_GPIO - gpio_set_level(GPIO_USB_C0_DP_OE_L, !lvl); - gpio_set_level(GPIO_USB_C0_DP_POLARITY, - board_get_polarity(port)); + board_set_dp_mux_control(lvl, board_get_polarity(port)); #endif /* set the minimum time delay (2ms) for the next HPD IRQ */ hpd_deadline[port] = get_time().val + HPD_USTREAM_DEBOUNCE_LVL; @@ -389,7 +384,7 @@ static void svdm_exit_dp_mode(int port) svdm_safe_dp_mode(port); gpio_set_level(GPIO_USB_C0_HPD_OD, 0); #ifdef VARIANT_KUKUI_DP_MUX_GPIO - gpio_set_level(GPIO_USB_C0_DP_OE_L, 1); + board_set_dp_mux_control(0, 0); #endif mux->hpd_update(port, 0, 0); } diff --git a/board/kukui/board.c b/board/kukui/board.c index 3eb28bb4c7..a19b92d6cb 100644 --- a/board/kukui/board.c +++ b/board/kukui/board.c @@ -19,6 +19,7 @@ #include "driver/charger/rt946x.h" #include "driver/sync.h" #include "driver/tcpm/mt6370.h" +#include "driver/usb_mux/it5205.h" #include "extpower.h" #include "gpio.h" #include "hooks.h" @@ -100,10 +101,30 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { }, }; +void board_set_dp_mux_control(int output_enable, int polarity) +{ + if (board_get_version() >= 5) + return; + + gpio_set_level(GPIO_USB_C0_DP_OE_L, !output_enable); + if (output_enable) + gpio_set_level(GPIO_USB_C0_DP_POLARITY, polarity); +} + +static void board_hpd_update(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] = { { - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .port_addr = IT5205_I2C_ADDR1_FLAGS, + .driver = &it5205_usb_mux_driver, + .hpd_update = &board_hpd_update, }, }; @@ -301,6 +322,13 @@ static void board_rev_init(void) (PI3USB9201_USB_PATH_ON << PI3USB9201_REG_CTRL_1_MODE_SHIFT)); } + + if (board_get_version() < 5) { + gpio_set_flags(GPIO_USB_C0_DP_OE_L, GPIO_OUT_HIGH); + gpio_set_flags(GPIO_USB_C0_DP_POLARITY, GPIO_OUT_LOW); + usb_muxes[0].driver = &virtual_usb_mux_driver; + usb_muxes[0].hpd_update = &virtual_hpd_update; + } } DECLARE_HOOK(HOOK_INIT, board_rev_init, HOOK_PRIO_INIT_ADC + 1); diff --git a/board/kukui/board.h b/board/kukui/board.h index 4fd1a76a50..c7d2da1ed9 100644 --- a/board/kukui/board.h +++ b/board/kukui/board.h @@ -23,6 +23,7 @@ #include "baseboard.h" +#define CONFIG_USB_MUX_IT5205 #define CONFIG_VOLUME_BUTTONS /* Battery */ @@ -74,6 +75,7 @@ /* I2C ports */ #define I2C_PORT_CHARGER 0 #define I2C_PORT_TCPC0 0 +#define I2C_PORT_USB_MUX 0 #define I2C_PORT_BATTERY 1 #define I2C_PORT_VIRTUAL_BATTERY I2C_PORT_BATTERY #define I2C_PORT_ACCEL 1 diff --git a/board/kukui/gpio.inc b/board/kukui/gpio.inc index f9ddacc6ec..e90644432b 100644 --- a/board/kukui/gpio.inc +++ b/board/kukui/gpio.inc @@ -48,6 +48,9 @@ GPIO_INT(POGO_ADC_INT_L, PIN(A, 6), GPIO_INT_BOTH, /* unused */ GPIO(POGO_VBUS_PRESENT, PIN(A, 14), GPIO_INPUT) +/* unused after board rev 5 */ +GPIO(USB_C0_DP_POLARITY, PIN(C, 14), GPIO_INPUT) +GPIO(USB_C0_DP_OE_L, PIN(A, 5), GPIO_INPUT) /* Reset pins */ @@ -80,10 +83,8 @@ GPIO(CCD_MODE_ODL, PIN(A, 1), GPIO_INPUT) GPIO(ENTERING_RW, PIN(C, 6), GPIO_ODR_HIGH) /* EC_ENTERING_RW_ODL */ GPIO(EC_INT_L, PIN(B, 12), GPIO_ODR_HIGH) /* EC_AP_INT_ODL */ GPIO(EC_BOARD_ID_EN_L, PIN(C, 15), GPIO_ODR_HIGH) /* EC_BOARD_ID_EN_ODL */ -GPIO(USB_C0_DP_POLARITY, PIN(C, 14), GPIO_OUT_LOW) GPIO(USB_C0_HPD_OD, PIN(F, 1), GPIO_ODR_LOW) GPIO(BOOTBLOCK_EN_L, PIN(C, 1), GPIO_ODR_HIGH) -GPIO(USB_C0_DP_OE_L, PIN(A, 5), GPIO_OUT_HIGH) GPIO(EN_PP3300_POGO, PIN(A, 13), GPIO_OUT_LOW) GPIO(EN_POGO_CHARGE_L, PIN(B, 6), GPIO_OUT_HIGH) GPIO(EN_USBC_CHARGE_L, PIN(C, 7), GPIO_OUT_LOW) -- cgit v1.2.1