diff options
author | Ting Shen <phoenixshen@google.com> | 2022-03-22 16:41:49 +0800 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-03-24 08:43:24 +0000 |
commit | afd0ecee75d284bb2a58d1b4be5a560b9e061f1a (patch) | |
tree | 83c31b887cb059f875d7ddd18b892dca0aebae14 | |
parent | 8c0ed26dbf75fa901f2b76198e01fb629e204f48 (diff) | |
download | chrome-ec-afd0ecee75d284bb2a58d1b4be5a560b9e061f1a.tar.gz |
corsola: implement FCFS on SVDM exit
Don't toggle hpd pin when unplug a non-active DP port.
BUG=b:223088393
TEST=1) manually verify that b:223088393 is not reproducible
2) Check ec_ap_dp_hpd_odl state after random plug/unplug operations
BRANCH=none
Signed-off-by: Ting Shen <phoenixshen@google.com>
Change-Id: Iccd6a426717d0150b243793dab36d0ffc3e44176
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3541661
Reviewed-by: Eric Yilun Lin <yllin@google.com>
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r-- | zephyr/projects/corsola/src/usb_pd_policy.c | 29 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/usbc_config.c | 3 |
2 files changed, 25 insertions, 7 deletions
diff --git a/zephyr/projects/corsola/src/usb_pd_policy.c b/zephyr/projects/corsola/src/usb_pd_policy.c index a33bb1d715..c8169e3877 100644 --- a/zephyr/projects/corsola/src/usb_pd_policy.c +++ b/zephyr/projects/corsola/src/usb_pd_policy.c @@ -27,6 +27,12 @@ int pd_check_vconn_swap(int port) return chipset_in_state(CHIPSET_STATE_SUSPEND | CHIPSET_STATE_ON); } +static void set_dp_aux_path_sel(int port) +{ + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel), port); + CPRINTS("Set DP_AUX_PATH_SEL: %d", port); +} + int svdm_get_hpd_gpio(int port) { /* HPD is low active, inverse the result */ @@ -35,11 +41,25 @@ int svdm_get_hpd_gpio(int port) void svdm_set_hpd_gpio(int port, int en) { + static int active_port = -1; + /* - * HPD is low active, inverse the en - * TODO: C0&C1 shares the same HPD, implement FCFS policy. + * HPD is low active, inverse the en. + * + * Implement FCFS policy: + * 1) Enable hpd if no active port. + * 2) Disable hpd if active port is the given port. */ - gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(ec_ap_dp_hpd_odl), !en); + if (en && active_port < 0) { + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(ec_ap_dp_hpd_odl), 0); + active_port = port; + } + + if (!en && active_port == port) { + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(ec_ap_dp_hpd_odl), 1); + active_port = -1; + set_dp_aux_path_sel(0); + } } __override int svdm_dp_config(int port, uint32_t *payload) @@ -108,8 +128,7 @@ __override int svdm_dp_attention(int port, uint32_t *payload) } if (lvl) { - gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel), port); - CPRINTS("Set DP_AUX_PATH_SEL: %d", port); + set_dp_aux_path_sel(port); usb_mux_set(port, USB_PD_MUX_DOCK, USB_SWITCH_CONNECT, diff --git a/zephyr/projects/corsola/src/usbc_config.c b/zephyr/projects/corsola/src/usbc_config.c index 72d0520123..240e94ecba 100644 --- a/zephyr/projects/corsola/src/usbc_config.c +++ b/zephyr/projects/corsola/src/usbc_config.c @@ -143,8 +143,7 @@ static void ps185_hdmi_hpd_deferred(void) debounced_hpd); CPRINTS("Set DP_AUX_PATH_SEL: %d", 1); } - gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(ec_ap_dp_hpd_odl), - !debounced_hpd); + svdm_set_hpd_gpio(USBC_PORT_C1, debounced_hpd); CPRINTS(debounced_hpd ? "HDMI plug" : "HDMI unplug"); } DECLARE_DEFERRED(ps185_hdmi_hpd_deferred); |