summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2013-09-16 15:11:54 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-09-16 22:55:18 +0000
commit92f59f782d7b42eada17727820cb33a7be00a908 (patch)
treec34d2ea27eef29cc4d0afb340fda1cea51678057
parent3a2ef8cb38d9b0fcc638bbc9a5f7a465a8b14565 (diff)
downloadchrome-ec-92f59f782d7b42eada17727820cb33a7be00a908.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. Original-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> (cherry picked from commit 06aebc4f95179ba4a642623081168d590ab7700c) Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Change-Id: I401c43ac463f754f064e353099814feae3db2452 Reviewed-on: https://chromium-review.googlesource.com/169651 Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Commit-Queue: Duncan Laurie <dlaurie@chromium.org> Tested-by: Duncan Laurie <dlaurie@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 690679499c..bbb7835f11 100644
--- a/board/falco/board.c
+++ b/board/falco/board.c
@@ -57,7 +57,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 91c43da285..d016c73c44 100644
--- a/board/falco/board.h
+++ b/board/falco/board.h
@@ -185,6 +185,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);
+