diff options
author | Zick Wei <zick.wei@quanta.corp-partner.google.com> | 2020-10-13 18:50:56 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-10-15 06:47:54 +0000 |
commit | 6880147bc323ffb8dff02025ffa9eb7bf920ccfb (patch) | |
tree | 82534ac398272a1d36640fc388237a453888b05c /board/berknip | |
parent | e4c3ec56c5002ce4ed425495eaa50379d9eb3b96 (diff) | |
download | chrome-ec-6880147bc323ffb8dff02025ffa9eb7bf920ccfb.tar.gz |
berknip: use HPD to disable pi3hdx1204 in S0
This patch use HPD HDMI HPD signal to enable/disable
HDMI retimer pi3hdx1204 in S0 to save power.
BUG=none
BRANCH=zork
TEST=verify HDMI display function normally
Signed-off-by: Zick Wei <zick.wei@quanta.corp-partner.google.com>
Change-Id: I371e5a2ceb1474a038e92b3ff0122c327f41a39f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2467601
Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'board/berknip')
-rw-r--r-- | board/berknip/board.c | 33 | ||||
-rw-r--r-- | board/berknip/board.h | 2 | ||||
-rw-r--r-- | board/berknip/gpio.inc | 2 |
3 files changed, 33 insertions, 4 deletions
diff --git a/board/berknip/board.c b/board/berknip/board.c index 9e7be926b7..0d6f415cfe 100644 --- a/board/berknip/board.c +++ b/board/berknip/board.c @@ -37,6 +37,8 @@ #include "usb_charge.h" #include "usb_mux.h" +static void hdmi_hpd_interrupt(enum gpio_signal signal); + #include "gpio_list.h" #define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ## args) @@ -78,6 +80,11 @@ const struct pi3hdx1204_tuning pi3hdx1204_tuning = { .de_offset = PI3HDX1204_DE_DB_MINUS5, }; +static int check_hdmi_hpd_status(void) +{ + return gpio_get_level(GPIO_DP1_HPD_EC_IN); +} + /***************************************************************************** * Board suspend / resume */ @@ -91,7 +98,7 @@ static void board_chipset_resume(void) msleep(PI3HDX1204_POWER_ON_DELAY_MS); pi3hdx1204_enable(I2C_PORT_TCPC1, PI3HDX1204_I2C_ADDR_FLAGS, - 1); + check_hdmi_hpd_status()); } } DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT); @@ -265,6 +272,10 @@ static void board_remap_gpio(void) */ gpio_set_flags(GPIO_USB_C1_HPD_IN_DB_V1, GPIO_OUT_LOW); board_usbc1_retimer_inhpd = GPIO_USB_C1_HPD_IN_DB_V1; + + if (ec_config_has_hdmi_retimer_pi3hdx1204()) + gpio_enable_interrupt(GPIO_DP1_HPD_EC_IN); + } else board_usbc1_retimer_inhpd = IOEX_USB_C1_HPD_IN_DB; } @@ -278,6 +289,26 @@ static void setup_fw_config(void) /* Use HOOK_PRIO_INIT_I2C + 2 to be after ioex_init(). */ DECLARE_HOOK(HOOK_INIT, setup_fw_config, HOOK_PRIO_INIT_I2C + 2); +static void hdmi_hpd_handler(void) +{ + /* Pass HPD through DB OPT1 HDMI connector to AP's DP1 */ + int hpd = check_hdmi_hpd_status(); + + gpio_set_level(GPIO_EC_DP1_HPD, hpd); + ccprints("HDMI HPD %d", hpd); + pi3hdx1204_enable(I2C_PORT_TCPC1, + PI3HDX1204_I2C_ADDR_FLAGS, + chipset_in_or_transitioning_to_state(CHIPSET_STATE_ON) + && hpd); +} +DECLARE_DEFERRED(hdmi_hpd_handler); + +static void hdmi_hpd_interrupt(enum gpio_signal signal) +{ + /* Debounce for 2 msec */ + hook_call_deferred(&hdmi_hpd_handler_data, (2 * MSEC)); +} + /***************************************************************************** * Fan */ diff --git a/board/berknip/board.h b/board/berknip/board.h index d6e127ca3c..8260c37313 100644 --- a/board/berknip/board.h +++ b/board/berknip/board.h @@ -200,8 +200,6 @@ extern const struct usb_mux usbc1_tusb544; extern const struct usb_mux usbc1_ps8743; extern struct usb_mux usbc1_amd_fp5_usb_mux; -void hdmi_hpd_interrupt(enum ioex_signal signal); - #ifdef CONFIG_KEYBOARD_FACTORY_TEST extern const int keyboard_factory_scan_pins[][2]; extern const int keyboard_factory_scan_pins_used; diff --git a/board/berknip/gpio.inc b/board/berknip/gpio.inc index e265101d2b..860cbba284 100644 --- a/board/berknip/gpio.inc +++ b/board/berknip/gpio.inc @@ -36,6 +36,7 @@ GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, extpower_inter GPIO_INT(EC_WP_L, PIN(5, 0), GPIO_INT_BOTH, switch_interrupt) GPIO_INT(VOLDN_BTN_ODL, PIN(A, 6), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) GPIO_INT(VOLUP_BTN_ODL, PIN(9, 5), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) +GPIO_INT(DP1_HPD_EC_IN, PIN(7, 5), GPIO_INT_BOTH, hdmi_hpd_interrupt) /* GPIO_INT_BOTH is required for PSL wake from hibernate, but we don't need an interrupt handler. */ GPIO(EC_RST_ODL, PIN(0, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH) @@ -60,7 +61,6 @@ GPIO(USB_C0_HPD, PIN(F, 5), GPIO_OUT_LOW) /* C0 DP Hotplug Detect */ GPIO(USB_C0_IN_HPD, PIN(7, 3), GPIO_OUT_LOW) /* C0 IN Hotplug Detect */ GPIO(EC_DP1_HPD, PIN(F, 4), GPIO_OUT_LOW) /* C1 DP Hotplug Detect */ GPIO(DP2_HPD, PIN(C, 1), GPIO_OUT_LOW) /* C1 DP Hotplug Detect */ -GPIO(DP1_HPD_EC_IN, PIN(7, 5), GPIO_INPUT) /* C1 IN Hotplug Detect */ GPIO(EC_H1_PACKET_MODE, PIN(8, 6), GPIO_OUT_LOW) /* H1 Packet Mode */ UNIMPLEMENTED(NO_HPD) |