diff options
author | Eric Yilun Lin <yllin@chromium.org> | 2020-05-12 11:31:12 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-07-08 13:03:37 +0000 |
commit | 478f28b630d531705c62fb681bfa273360cd623c (patch) | |
tree | deab483754cdb9e9af2f15f2631eca657f0e7d65 /board/asurada/board.c | |
parent | 513edca98eb7edacb1182f112bdc52cc519bbe16 (diff) | |
download | chrome-ec-478f28b630d531705c62fb681bfa273360cd623c.tar.gz |
asurada: enable HDMI subboard
This CL configures the GPIO pin on HDMI subboard(shares with
TYPE-C subboard), and plays GPIO_EC_DPBRDG_HPD_ODL on
receiving HDMI HPD events.
Also, disable the unused tasks if HDMI subboard connected.
BUG=b:154565980
TEST=ensure GPIO pins are in a valid state; ensure HDMI plug/unplug
triggers correct event.
BRANCH=master
Change-Id: Iea0014270d4d8eac67bb51354fafe75ee677d5b0
Signed-off-by: Eric Yilun Lin <yllin@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2195722
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'board/asurada/board.c')
-rw-r--r-- | board/asurada/board.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/board/asurada/board.c b/board/asurada/board.c index da0ba23277..4a342151c1 100644 --- a/board/asurada/board.c +++ b/board/asurada/board.c @@ -122,8 +122,12 @@ DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); static void board_tcpc_init(void) { gpio_enable_interrupt(GPIO_USB_C0_PPC_INT_ODL); - if (board_get_sub_board() == SUB_BOARD_TYPEC) - gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL); + /* C1: GPIO_USB_C1_PPC_INT_ODL & HDMI: GPIO_PS185_EC_DP_HPD */ + gpio_enable_interrupt(GPIO_X_EC_GPIO2); + + /* If this is not a Type-C subboard, disable the task. */ + if (board_get_sub_board() != SUB_BOARD_TYPEC) + task_disable_task(TASK_ID_PD_C1); } /* Must be done after I2C and subboard */ DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_I2C + 1); @@ -209,6 +213,9 @@ static void board_sub_bc12_init(void) { if (board_get_sub_board() == SUB_BOARD_TYPEC) gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_L); + else + /* If this is not a Type-C subboard, disable the task. */ + task_disable_task(TASK_ID_USB_CHG_P1); } /* Must be done after I2C and subboard */ DECLARE_HOOK(HOOK_INIT, board_sub_bc12_init, HOOK_PRIO_INIT_I2C + 1); @@ -261,9 +268,31 @@ static void ppc_interrupt(enum gpio_signal signal) syv682x_interrupt(0); } +int debounced_hpd; + +/** + * Handle PS185 HPD changing state. + */ +static void ps185_hdmi_hpd_deferred(void) +{ + const int new_hpd = gpio_get_level(GPIO_PS185_EC_DP_HPD); + + /* HPD status not changed, probably a glitch, just return. */ + if (debounced_hpd == new_hpd) + return; + + debounced_hpd = new_hpd; + + gpio_set_level(GPIO_EC_DPBRDG_HPD_ODL, !debounced_hpd); + CPRINTS(debounced_hpd ? "HDMI plug" : "HDMI unplug"); +} +DECLARE_DEFERRED(ps185_hdmi_hpd_deferred); + +#define PS185_HPD_DEBOUCE 250 + static void hdmi_hpd_interrupt(enum gpio_signal signal) { - /* TODO: implement HDMI HPD */ + hook_call_deferred(&ps185_hdmi_hpd_deferred_data, PS185_HPD_DEBOUCE); } /* HDMI/TYPE-C function shared subboard interrupt */ @@ -466,6 +495,12 @@ static enum board_sub_board board_get_sub_board(void) sub = SUB_BOARD_HDMI; /* Only has 1 PPC with HDMI subboard */ ppc_cnt = 1; + /* EC_X_GPIO1 */ + gpio_set_flags(GPIO_EN_HDMI_PWR, GPIO_OUT_HIGH); + /* X_EC_GPIO2 */ + gpio_set_flags(GPIO_PS185_EC_DP_HPD, GPIO_INT_BOTH); + /* EC_X_GPIO3 */ + gpio_set_flags(GPIO_PS185_PWRDN_ODL, GPIO_ODR_HIGH); } else { sub = SUB_BOARD_TYPEC; /* EC_X_GPIO1 */ |