diff options
-rw-r--r-- | board/falco/board.c | 2 | ||||
-rw-r--r-- | board/falco/board.h | 5 | ||||
-rw-r--r-- | board/falco/build.mk | 2 | ||||
-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); + |