diff options
Diffstat (limited to 'board/trembyle/board.c')
-rw-r--r-- | board/trembyle/board.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/board/trembyle/board.c b/board/trembyle/board.c index 0add1454d3..8fa429f83a 100644 --- a/board/trembyle/board.c +++ b/board/trembyle/board.c @@ -308,6 +308,9 @@ void setup_fw_config(void) gpio_enable_interrupt(GPIO_6AXIS_INT_L); 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); @@ -368,3 +371,34 @@ static void setup_fans(void) thermal_params[TEMP_SENSOR_CPU] = thermal_cpu; } DECLARE_HOOK(HOOK_INIT, setup_fans, 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)); +} |