summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-08-30 08:58:01 -0500
committerChrome Cron <account-1103494@chromium-review.googlesource.com>2013-09-06 17:03:06 +0000
commit06aebc4f95179ba4a642623081168d590ab7700c (patch)
tree5aa9e432a840dfc0b3f5948effb7d98fdecb1a24
parent2a31e2ac4bc899de7dfbfcca191376ce7063fd2c (diff)
downloadchrome-ec-06aebc4f95179ba4a642623081168d590ab7700c.tar.gz
falco: delay LCD VCC enable by 270ms
Much like the backlight signal the LCD VCC enable signal needs to be delayed to ensure the panel timings are correct. It's problematic because the LVDS bridge is a black box. The signals need to be scoped to ensure everything eventually matches up. BUG=chrome-os-partner:21234 BRANCH=falco TEST=Built and booted. Panels still come up. Dexter determined the proper delay. Change-Id: I6e61d1dfa9ad03be1735d05d8d8ff2549a7b0db2 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/167620 Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--board/falco/board.c2
-rw-r--r--board/falco/board.h5
-rw-r--r--board/falco/build.mk2
-rw-r--r--board/falco/panel.c (renamed from board/falco/backlight.c)72
4 files changed, 64 insertions, 17 deletions
diff --git a/board/falco/board.c b/board/falco/board.c
index c43c3d08f5..36ef65ad3e 100644
--- a/board/falco/board.c
+++ b/board/falco/board.c
@@ -61,7 +61,7 @@ const struct gpio_info gpio_list[] = {
{"VCORE_PGOOD", LM4_GPIO_C, (1<<6), GPIO_INT_BOTH,
x86_interrupt},
{"PCH_EDP_VDD_EN", LM4_GPIO_J, (1<<1), GPIO_INT_BOTH,
- haswell_interrupt},
+ lcdvcc_interrupt},
{"RECOVERY_L", LM4_GPIO_A, (1<<5), GPIO_PULL_UP|GPIO_INT_BOTH,
switch_interrupt},
{"WP_L", LM4_GPIO_A, (1<<4), GPIO_INT_BOTH,
diff --git a/board/falco/board.h b/board/falco/board.h
index b8794fa201..2c2e6a054a 100644
--- a/board/falco/board.h
+++ b/board/falco/board.h
@@ -199,6 +199,11 @@ enum temp_sensor_id {
};
/**
+ * LCD VCC enable interrupt.
+ */
+void lcdvcc_interrupt(enum gpio_signal signal);
+
+/**
* Board-specific g781 power state.
*/
int board_g781_has_power(void);
diff --git a/board/falco/build.mk b/board/falco/build.mk
index b7f987e71f..6d1006db16 100644
--- a/board/falco/build.mk
+++ b/board/falco/build.mk
@@ -9,4 +9,4 @@
# the IC is TI Stellaris LM4
CHIP:=lm4
-board-y=board.o backlight.o
+board-y=board.o panel.o
diff --git a/board/falco/backlight.c b/board/falco/panel.c
index a1d0b44b0f..863ad24e1f 100644
--- a/board/falco/backlight.c
+++ b/board/falco/panel.c
@@ -14,9 +14,13 @@
* enable signal. The reason is that Falco has a LVDS bridge which controls
* all the other signals for the panel except the backlight. In order to
* meet the penel power sequencing requirements a delay needs to be added.
+ *
+ * Additionally the LCDVCC needs to be delayed on a 0->1 transition of the
+ * PCH's EDP VDD enable signal to meet the panel specification.
*/
#define BL_ENABLE_DELAY_US 420000 /* 420 ms delay */
+#define LCDVCC_ENABLE_DELAY_US 270000 /* 270 ms delay */
static int backlight_deferred_value;
@@ -54,21 +58,6 @@ static void update_backlight(void)
}
DECLARE_HOOK(HOOK_LID_CHANGE, update_backlight, HOOK_PRIO_DEFAULT);
-/**
- * Initialize backlight module.
- */
-static void backlight_init(void)
-{
- /* Set initial deferred value and signal to the current PCH signal. */
- backlight_deferred_value = gpio_get_level(GPIO_PCH_BKLTEN);
- set_backlight_value();
-
- update_backlight();
-
- gpio_enable_interrupt(GPIO_PCH_BKLTEN);
-}
-DECLARE_HOOK(HOOK_INIT, backlight_init, HOOK_PRIO_DEFAULT);
-
void backlight_interrupt(enum gpio_signal signal)
{
update_backlight();
@@ -87,3 +76,56 @@ DECLARE_HOST_COMMAND(EC_CMD_SWITCH_ENABLE_BKLIGHT,
switch_command_enable_backlight, 0);
+static int lcdvcc_en_deferred_value;
+
+static void set_lcdvcc_en_value(void)
+{
+ gpio_set_level(GPIO_EC_EDP_VDD_EN, lcdvcc_en_deferred_value);
+}
+DECLARE_DEFERRED(set_lcdvcc_en_value);
+
+void lcdvcc_interrupt(enum gpio_signal signal)
+{
+ int pch_value;
+
+ pch_value = gpio_get_level(GPIO_PCH_EDP_VDD_EN);
+
+ /* Immediately disable the LCDVCC when the PCH indicates as such. */
+ if (!pch_value) {
+ /* If there was a scheduled callback pending make sure it picks
+ * up the disabled value. */
+ lcdvcc_en_deferred_value = 0;
+ gpio_set_level(GPIO_EC_EDP_VDD_EN, 0);
+ /* Cancel pending hook */
+ hook_call_deferred(&set_lcdvcc_en_value, -1);
+ return;
+ }
+ /* Handle a 0->1 transition by calling a deferred hook. */
+ if (pch_value && !lcdvcc_en_deferred_value) {
+ lcdvcc_en_deferred_value = 1;
+ hook_call_deferred(&set_lcdvcc_en_value,
+ LCDVCC_ENABLE_DELAY_US);
+ }
+}
+
+/**
+ * Initialize panel module.
+ */
+static void panel_init(void)
+{
+ /* Set initial deferred value and signal to the current PCH signal. */
+ backlight_deferred_value = gpio_get_level(GPIO_PCH_BKLTEN);
+ set_backlight_value();
+
+ update_backlight();
+
+ gpio_enable_interrupt(GPIO_PCH_BKLTEN);
+
+ /* The interrupt is enabled for the GPIO_PCH_EDP_VDD_EN in the
+ * chipset_haswell.c compilation unit. Initially set the value
+ * to whatever it current is reading. */
+ lcdvcc_en_deferred_value = gpio_get_level(GPIO_PCH_EDP_VDD_EN);
+ set_lcdvcc_en_value();
+}
+DECLARE_HOOK(HOOK_INIT, panel_init, HOOK_PRIO_DEFAULT);
+