summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
+