diff options
Diffstat (limited to 'zephyr/program/geralt/src')
-rw-r--r-- | zephyr/program/geralt/src/hibernate.c | 3 | ||||
-rw-r--r-- | zephyr/program/geralt/src/hooks.c | 8 | ||||
-rw-r--r-- | zephyr/program/geralt/src/usb_pd_policy.c | 2 | ||||
-rw-r--r-- | zephyr/program/geralt/src/usbc_config.c | 46 |
4 files changed, 58 insertions, 1 deletions
diff --git a/zephyr/program/geralt/src/hibernate.c b/zephyr/program/geralt/src/hibernate.c index c83d37cc91..fb70248338 100644 --- a/zephyr/program/geralt/src/hibernate.c +++ b/zephyr/program/geralt/src/hibernate.c @@ -9,5 +9,8 @@ /* Geralt board specific hibernate implementation */ __override void board_hibernate_late(void) { + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(en_pp5000_z1_l), 1); + /* It takes around 30ms to release the PP5000 capacitance. */ + udelay(30 * MSEC); gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(en_ulp), 1); } 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/usb_pd_policy.c b/zephyr/program/geralt/src/usb_pd_policy.c index c445fc0e22..72558b50d6 100644 --- a/zephyr/program/geralt/src/usb_pd_policy.c +++ b/zephyr/program/geralt/src/usb_pd_policy.c @@ -18,7 +18,7 @@ int pd_check_vconn_swap(int port) int pd_snk_is_vbus_provided(int port) { - static atomic_t vbus_prev[CONFIG_USB_PD_PORT_MAX_COUNT]; + __maybe_unused static atomic_t vbus_prev[CONFIG_USB_PD_PORT_MAX_COUNT]; int vbus; /* 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; + } +} |