diff options
Diffstat (limited to 'board/phaser')
-rw-r--r-- | board/phaser/board.c | 50 | ||||
-rw-r--r-- | board/phaser/board.h | 6 | ||||
-rw-r--r-- | board/phaser/gpio.inc | 4 |
3 files changed, 54 insertions, 6 deletions
diff --git a/board/phaser/board.c b/board/phaser/board.c index d4a5fb00ae..092c30c40a 100644 --- a/board/phaser/board.c +++ b/board/phaser/board.c @@ -19,16 +19,20 @@ #include "extpower.h" #include "gpio.h" #include "hooks.h" +#include "keyboard_scan.h" #include "lid_switch.h" #include "power.h" #include "power_button.h" #include "switch.h" #include "task.h" +#include "tablet_mode.h" #include "tcpci.h" #include "temp_sensor.h" #include "thermistor.h" #include "util.h" +static uint16_t sku_id; + static void tcpc_alert_event(enum gpio_signal signal) { if ((signal == GPIO_USB_C1_MUX_INT_ODL) && @@ -120,8 +124,6 @@ static struct lsm6dsm_data lsm6dsm_g_data; static struct lsm6dsm_data lsm6dsm_a_data; /* Drivers */ -/* lis2de only has a i2c address difference, so we use lis2dh driver */ -/* but use a different address */ struct motion_sensor_t motion_sensors[] = { [LID_ACCEL] = { .name = "Lid Accel", @@ -197,7 +199,32 @@ struct motion_sensor_t motion_sensors[] = { }, }; -const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); +unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); + +static int board_is_convertible(void) +{ + return (sku_id > 0 && sku_id <= 6) || sku_id == 255; +} + +static void board_set_motion_sensor_count(void) +{ + if (board_is_convertible()) + motion_sensor_count = ARRAY_SIZE(motion_sensors); + else + motion_sensor_count = 0; +} + +static void cbi_init(void) +{ + uint32_t val; + + if (cbi_get_sku_id(&val) == EC_SUCCESS) + sku_id = val; + ccprints("SKU: 0x%04x", sku_id); + + board_set_motion_sensor_count(); +} +DECLARE_HOOK(HOOK_INIT, cbi_init, HOOK_PRIO_INIT_I2C + 1); /* Initialize board. */ static void board_init(void) @@ -206,3 +233,20 @@ static void board_init(void) gpio_enable_interrupt(GPIO_BASE_SIXAXIS_INT_L); } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); + +#ifndef TEST_BUILD +/* This callback disables keyboard when convertibles are fully open */ +void lid_angle_peripheral_enable(int enable) +{ + /* + * If the lid is in tablet position via other sensors, + * ignore the lid angle, which might be faulty then + * disable keyboard. + */ + if (tablet_get_mode()) + enable = 0; + + if (board_is_convertible()) + keyboard_scan_enable(enable, KB_SCAN_DISABLE_LID_ANGLE); +} +#endif diff --git a/board/phaser/board.h b/board/phaser/board.h index c8c866b703..17f3ab37e7 100644 --- a/board/phaser/board.h +++ b/board/phaser/board.h @@ -36,8 +36,14 @@ #define CONFIG_ACCEL_FORCE_MODE_MASK (1 << LID_ACCEL) #define CONFIG_LID_ANGLE +#define CONFIG_LID_ANGLE_UPDATE #define CONFIG_LID_ANGLE_SENSOR_BASE BASE_ACCEL #define CONFIG_LID_ANGLE_SENSOR_LID LID_ACCEL +#define CONFIG_DYNAMIC_MOTION_SENSOR_COUNT + +#define CONFIG_TABLET_MODE +#define CONFIG_TABLET_SWITCH +#define TABLET_MODE_GPIO_L GPIO_TABLET_MODE_L /* Interrupt and fifo are only used for base accelerometer * and the lid sensor is polled real-time (in forced mode). diff --git a/board/phaser/gpio.inc b/board/phaser/gpio.inc index 295fa5866a..6601822897 100644 --- a/board/phaser/gpio.inc +++ b/board/phaser/gpio.inc @@ -35,13 +35,11 @@ GPIO_INT(ALL_SYS_PGOOD, PIN(F, 4), GPIO_INT_BOTH, power_signal_interrupt) /* PM /* Other interrupts */ GPIO_INT(WP_L, PIN(A, 1), GPIO_INT_BOTH, switch_interrupt) /* EC_WP_ODL */ +GPIO_INT(TABLET_MODE_L, PIN(8, 6), GPIO_INT_BOTH, tablet_mode_isr) GPIO_INT(BASE_SIXAXIS_INT_L, PIN(5, 6), GPIO_INT_FALLING | GPIO_SEL_1P8V, lsm6dsm_interrupt) GPIO(LID_ACCEL_INT_L, PIN(5, 0), GPIO_INPUT | GPIO_SEL_1P8V) -/* TODO: Convert to GPIO_INT with tablet_mode_isr */ -GPIO(TABLET_MODE_L, PIN(8, 6), GPIO_INPUT) - /* Define PCH_SLP_S0_L after all interrupts if CONFIG_POWER_S0IX not defined. */ #ifndef CONFIG_POWER_S0IX GPIO(PCH_SLP_S0_L, PIN(A, 4), GPIO_INPUT) /* SLP_S0_L */ |