summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Yilun Lin <yllin@chromium.org>2023-02-14 13:40:12 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-02-14 09:47:55 +0000
commit3133ebdd94d74080f8a62d3987da9660f3e26e46 (patch)
tree735a9826c7b281c1eae29eb3fe2ef15a539125be
parent05aa517d25bd8516efd6d063d080c2db406d6467 (diff)
downloadchrome-ec-3133ebdd94d74080f8a62d3987da9660f3e26e46.tar.gz
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 <yllin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4247784 Auto-Submit: Eric Yilun Lin <yllin@google.com> Reviewed-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Eric Yilun Lin <yllin@google.com>
-rw-r--r--zephyr/program/geralt/interrupts.dtsi5
-rw-r--r--zephyr/program/geralt/src/hooks.c8
-rw-r--r--zephyr/program/geralt/src/usbc_config.c46
3 files changed, 59 insertions, 0 deletions
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 = <GPIO_INT_EDGE_FALLING>;
handler = "ccd_interrupt";
};
+ int_ap_xhci_init_done: ap-xhci-init-done {
+ irq-pin = <&ap_xhci_init_done>;
+ flags = <GPIO_INT_EDGE_RISING>;
+ 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 <zephyr/drivers/gpio.h>
+
#include <ap_power/ap_power.h>
#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;
+ }
+}