summaryrefslogtreecommitdiff
path: root/board/morphius/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/morphius/board.c')
-rw-r--r--board/morphius/board.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/board/morphius/board.c b/board/morphius/board.c
index a71e5dfacc..b80971994a 100644
--- a/board/morphius/board.c
+++ b/board/morphius/board.c
@@ -293,6 +293,9 @@ void setup_fw_config(void)
gpio_enable_interrupt(GPIO_EN_PWR_TOUCHPAD_PS2);
setup_mux();
+
+ if (ec_config_has_mst_hub_rtd2141b())
+ ioex_enable_interrupt(IOEX_MST_HPD_OUT);
}
DECLARE_HOOK(HOOK_INIT, setup_fw_config, HOOK_PRIO_INIT_I2C + 2);
@@ -451,3 +454,34 @@ static void board_chipset_suspend(void)
sb_smart_charge_mode(SB_SMART_CHARGE_ENABLE);
}
DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT);
+
+/*****************************************************************************
+ * MST hub
+ */
+
+static void mst_hpd_handler(void)
+{
+ int hpd = 0;
+
+ /*
+ * Ensure level on GPIO_DP1_HPD matches IOEX_MST_HPD_OUT, in case
+ * we got out of sync.
+ */
+ ioex_get_level(IOEX_MST_HPD_OUT, &hpd);
+ gpio_set_level(GPIO_DP1_HPD, hpd);
+ ccprints("MST HPD %d", hpd);
+}
+DECLARE_DEFERRED(mst_hpd_handler);
+
+void mst_hpd_interrupt(enum ioex_signal signal)
+{
+ /*
+ * Goal is to pass HPD through from DB OPT3 MST hub to AP's DP1.
+ * Immediately invert GPIO_DP1_HPD, to pass through the edge on
+ * IOEX_MST_HPD_OUT. Then check level after 2 msec debounce.
+ */
+ int hpd = !gpio_get_level(GPIO_DP1_HPD);
+
+ gpio_set_level(GPIO_DP1_HPD, hpd);
+ hook_call_deferred(&mst_hpd_handler_data, (2 * MSEC));
+}