summaryrefslogtreecommitdiff
path: root/board/berknip
diff options
context:
space:
mode:
authorZick Wei <zick.wei@quanta.corp-partner.google.com>2020-10-13 18:50:56 +0800
committerCommit Bot <commit-bot@chromium.org>2020-10-15 06:47:54 +0000
commit6880147bc323ffb8dff02025ffa9eb7bf920ccfb (patch)
tree82534ac398272a1d36640fc388237a453888b05c /board/berknip
parente4c3ec56c5002ce4ed425495eaa50379d9eb3b96 (diff)
downloadchrome-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.c33
-rw-r--r--board/berknip/board.h2
-rw-r--r--board/berknip/gpio.inc2
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)