summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2022-03-22 16:41:49 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-03-24 08:43:24 +0000
commitafd0ecee75d284bb2a58d1b4be5a560b9e061f1a (patch)
tree83c31b887cb059f875d7ddd18b892dca0aebae14
parent8c0ed26dbf75fa901f2b76198e01fb629e204f48 (diff)
downloadchrome-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.c29
-rw-r--r--zephyr/projects/corsola/src/usbc_config.c3
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);