From d447b71f7132111beb8f973337ec6cabf15fe384 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Fri, 2 Dec 2016 13:49:01 -0600 Subject: [PATCH] reef: ensure tablet mode state is correct at startup The tablet mode value is set to 1 on each program start (RO power on reset or any sysjump) in common tablet mode infrastructure. This results in the tablet mode not ever reflecting current reality at the beginning of each program. In addition to not being able to order hook callbacks within a single hook it's the luck of the draw if the tablet mode is set correctly if it was is being set within a hook callback. With a lid accelerometer that doesn't work it results in the input peripherals never being enabled. To fix all this ensure the tablet mode state reflects the current hardware input such that there's no ordering issues in addition to making it reflect reality. BUG=chrome-os-partner:60481 BRANCH=reef TEST=With a machine whose accelerometer is unattached. Keyboard and trackpad continue to work through suspend-resume, EC reboot, etc. Change-Id: I3456a7b578c9752344424721858756a33992a37d Signed-off-by: Aaron Durbin Reviewed-on: https://chromium-review.googlesource.com/416348 Reviewed-by: Daisuke Nojiri --- board/reef/board.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/board/reef/board.c b/board/reef/board.c index 8db512b45f..322bdf67ad 100644 --- a/board/reef/board.c +++ b/board/reef/board.c @@ -492,9 +492,18 @@ static void chipset_pre_init(void) } DECLARE_HOOK(HOOK_CHIPSET_PRE_INIT, chipset_pre_init, HOOK_PRIO_DEFAULT); +static void board_set_tablet_mode(void) +{ + tablet_set_mode(!gpio_get_level(GPIO_TABLET_MODE_L)); +} + /* Initialize board. */ static void board_init(void) { + /* Ensure tablet mode is initialized according to the hardware state + * so that the cached state reflects reality. */ + board_set_tablet_mode(); + gpio_enable_interrupt(GPIO_TABLET_MODE_L); /* Enable charger interrupts */ @@ -638,7 +647,7 @@ int board_is_vbus_too_low(enum chg_ramp_vbus_state ramp_state) static void enable_input_devices(void) { /* We need to turn on tablet mode for motion sense */ - tablet_set_mode(!gpio_get_level(GPIO_TABLET_MODE_L)); + board_set_tablet_mode(); /* Then, we disable peripherals only when the lid reaches 360 position. * (It's probably already disabled by motion_sense_task.)