summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2021-12-22 17:27:37 +0800
committerCommit Bot <commit-bot@chromium.org>2021-12-28 08:31:58 +0000
commit211facccfdb286a10e9d0f0a44a5d8231c0a49c2 (patch)
treea033fd1276b47ad4f45a2527faf5d2ea7fe14458
parentcd481cc2ce1cd27c0490a4534cefcfeba15d7471 (diff)
downloadchrome-ec-211facccfdb286a10e9d0f0a44a5d8231c0a49c2.tar.gz
cherry: merge HPD select and DP path select callbacks
Cherry's customized DP callbacks is out of sync with the original version. This causes DP_PATH_SEL not working properly. To fix this, move DP_PATH_SEL control into svdm_set_hpd_gpio, so we can reuse more parts of common code. BUG=b:211340354, b:206047978 TEST=manually, tested following scenarios 1) StarTech USB-C to HDMI adapter works with both ports. 2) DP_PATH_SEL updates when we replug HDMI dongle to another port. BRANCH=main Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: Id4f5bc2e76c58e12b5fe9c51ec1a8ba9718d9167 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3353168 Tested-by: Parker Lin <parkerlin@google.com> Reviewed-by: Eric Yilun Lin <yllin@google.com> Commit-Queue: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--baseboard/cherry/usb_pd_policy.c78
1 files changed, 30 insertions, 48 deletions
diff --git a/baseboard/cherry/usb_pd_policy.c b/baseboard/cherry/usb_pd_policy.c
index 0c7f4dcee5..cae89bffcf 100644
--- a/baseboard/cherry/usb_pd_policy.c
+++ b/baseboard/cherry/usb_pd_policy.c
@@ -28,21 +28,6 @@ static enum {
AUX_PORT_C1HDMI = 1,
} aux_port = AUX_PORT_NONE;
-int svdm_get_hpd_gpio(int port)
-{
- /* HPD is low active, inverse the result */
- return !gpio_get_level(GPIO_EC_AP_DP_HPD_ODL);
-}
-
-void svdm_set_hpd_gpio(int port, int en)
-{
- /*
- * HPD is low active, inverse the en
- * TODO: C0&C1 shares the same HPD, implement FCFS policy.
- */
- gpio_set_level(GPIO_EC_AP_DP_HPD_ODL, !en);
-}
-
static void aux_switch_port(int port)
{
if (port != AUX_PORT_NONE)
@@ -66,6 +51,33 @@ static void aux_display_disconnected(int port)
aux_switch_port(AUX_PORT_NONE);
}
+int svdm_get_hpd_gpio(int port)
+{
+ /* HPD is low active, inverse the result */
+ return !gpio_get_level(GPIO_EC_AP_DP_HPD_ODL);
+}
+
+void svdm_set_hpd_gpio(int port, int en)
+{
+ /*
+ * Cherry can only output to 1 display port at a time.
+ * This implements FCFS policy by changing the aux channel. If a
+ * display is connected to the either port (says A), and the port A
+ * will be served until the display is disconnected from port A.
+ * It won't output to the other display which connects to port B.
+ */
+ if (en) {
+ if (aux_port == AUX_PORT_NONE)
+ aux_switch_port(port);
+ } else {
+ aux_display_disconnected(port);
+ }
+ /*
+ * HPD is low active, inverse the en
+ */
+ gpio_set_level_verbose(CC_USBPD, GPIO_EC_AP_DP_HPD_ODL, !en);
+}
+
__override int svdm_dp_attention(int port, uint32_t *payload)
{
int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]);
@@ -115,6 +127,9 @@ __override int svdm_dp_attention(int port, uint32_t *payload)
* b/171172053#comment14: since the HPD_DSTREAM_DEBOUNCE_IRQ is
* very short (500us), we can use udelay instead of usleep for
* more stable pulse period.
+ *
+ * Note that this should be the only difference between our code
+ * and common code.
*/
udelay(HPD_DSTREAM_DEBOUNCE_IRQ);
svdm_set_hpd_gpio(port, 1);
@@ -122,23 +137,6 @@ __override int svdm_dp_attention(int port, uint32_t *payload)
svdm_set_hpd_gpio(port, lvl);
}
- /*
- * Cherry can only output to 1 display port at a time.
- * This implements FCFS policy by changing the aux channel. If a
- * display is connected to the either port (says A), and the port A
- * will be served until the display is disconnected from port A.
- * It won't output to the other display which connects to port B.
- */
- if (lvl && aux_port == AUX_PORT_NONE)
- /*
- * A display is connected, and no display was plugged on either
- * port.
- */
- aux_switch_port(port);
- else if (!lvl)
- aux_display_disconnected(port);
-
-
/* set the minimum time delay (2ms) for the next HPD IRQ */
svdm_hpd_deadline[port] = get_time().val + HPD_USTREAM_DEBOUNCE_LVL;
#endif /* CONFIG_USB_PD_DP_HPD_GPIO */
@@ -156,22 +154,6 @@ __override int svdm_dp_attention(int port, uint32_t *payload)
return 1;
}
-__override void svdm_exit_dp_mode(int port)
-{
-#ifdef CONFIG_USB_PD_DP_HPD_GPIO
- svdm_set_hpd_gpio(port, 0);
-#endif /* CONFIG_USB_PD_DP_HPD_GPIO */
- usb_mux_hpd_update(port, USB_PD_MUX_HPD_LVL_DEASSERTED |
- USB_PD_MUX_HPD_IRQ_DEASSERTED);
-
- aux_display_disconnected(port);
-
-#ifdef USB_PD_PORT_TCPC_MST
- if (port == USB_PD_PORT_TCPC_MST)
- baseboard_mst_enable_control(port, 0);
-#endif
-}
-
int pd_snk_is_vbus_provided(int port)
{
static atomic_t vbus_prev[CONFIG_USB_PD_PORT_MAX_COUNT];