diff options
Diffstat (limited to 'board/morphius/board.c')
-rw-r--r-- | board/morphius/board.c | 34 |
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)); +} |