From 3133ebdd94d74080f8a62d3987da9660f3e26e46 Mon Sep 17 00:00:00 2001 From: Eric Yilun Lin Date: Tue, 14 Feb 2023 13:40:12 +0800 Subject: geralt: enable xhci interrupt After AP initiates the XHCI HUB, the AP will raise the XHCI interrupt to EC, and EC has to recycle the VBUS of the USB ports. BUG=b:269059211 TEST=depthcharge detects usb devices BRANCH=none Change-Id: Ic57fc91b76f28af7fb5c1bafe1926a6dd02333ca Signed-off-by: Eric Yilun Lin Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4247784 Auto-Submit: Eric Yilun Lin Reviewed-by: Ting Shen Commit-Queue: Ting Shen Tested-by: Eric Yilun Lin --- zephyr/program/geralt/interrupts.dtsi | 5 ++++ zephyr/program/geralt/src/hooks.c | 8 ++++++ zephyr/program/geralt/src/usbc_config.c | 46 +++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/zephyr/program/geralt/interrupts.dtsi b/zephyr/program/geralt/interrupts.dtsi index da02e13159..d808020e5c 100644 --- a/zephyr/program/geralt/interrupts.dtsi +++ b/zephyr/program/geralt/interrupts.dtsi @@ -101,5 +101,10 @@ flags = ; handler = "ccd_interrupt"; }; + int_ap_xhci_init_done: ap-xhci-init-done { + irq-pin = <&ap_xhci_init_done>; + flags = ; + handler = "xhci_interrupt"; + }; }; }; diff --git a/zephyr/program/geralt/src/hooks.c b/zephyr/program/geralt/src/hooks.c index 628ecdd0f8..bc21babe66 100644 --- a/zephyr/program/geralt/src/hooks.c +++ b/zephyr/program/geralt/src/hooks.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include "gpio/gpio_int.h" #include "gpio_signal.h" #include "hooks.h" @@ -31,6 +32,13 @@ static void board_i2c3_ctrl(bool enable) } } +static void geralt_common_init(void) +{ + gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_ap_xhci_init_done)); +} +DECLARE_HOOK(HOOK_INIT, geralt_common_init, HOOK_PRIO_PRE_DEFAULT); + static void board_enable_i2c3(void) { board_i2c3_ctrl(1); diff --git a/zephyr/program/geralt/src/usbc_config.c b/zephyr/program/geralt/src/usbc_config.c index 7c49f58237..21a6f88d0b 100644 --- a/zephyr/program/geralt/src/usbc_config.c +++ b/zephyr/program/geralt/src/usbc_config.c @@ -9,10 +9,16 @@ #include "charge_state_v2.h" #include "console.h" #include "driver/tcpm/it83xx_pd.h" +#include "gpio.h" +#include "gpio_signal.h" +#include "usb_charge.h" #include "usb_pd.h" +#include "usb_tc_sm.h" #include "usbc_ppc.h" #include "zephyr_adc.h" +#include + #include #define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ##args) @@ -129,3 +135,43 @@ enum adc_channel board_get_vbus_adc(int port) return ADC_VBUS_C0; } #endif /* CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT */ + +/* USB-A */ +void xhci_interrupt(enum gpio_signal signal) +{ + enum usb_charge_mode mode = + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(ap_xhci_init_done)) ? + USB_CHARGE_MODE_ENABLED : + USB_CHARGE_MODE_DISABLED; + + const int xhci_stat = gpio_get_level(signal); + + for (int i = 0; i < USB_PORT_COUNT; i++) { + usb_charge_set_mode(i, mode, USB_ALLOW_SUSPEND_CHARGE); + } + + for (int i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { + /* + * Enable DRP toggle after XHCI inited. This is used to follow + * USB 3.2 spec 10.3.1.1. + */ + if (xhci_stat) { + pd_set_dual_role(i, PD_DRP_TOGGLE_ON); + } else if (tc_is_attached_src(i)) { + /* + * This is a AP reset S0->S0 transition. + * We should set the role back to sink. + */ + pd_set_dual_role(i, PD_DRP_FORCE_SINK); + } + } +} + +__override enum pd_dual_role_states pd_get_drp_state_in_s0(void) +{ + if (gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(ap_xhci_init_done))) { + return PD_DRP_TOGGLE_ON; + } else { + return PD_DRP_FORCE_SINK; + } +} -- cgit v1.2.1