summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/coachz/board.c54
-rw-r--r--board/coachz/board.h3
2 files changed, 56 insertions, 1 deletions
diff --git a/board/coachz/board.c b/board/coachz/board.c
index b7911214d5..1191b4566a 100644
--- a/board/coachz/board.c
+++ b/board/coachz/board.c
@@ -17,6 +17,7 @@
#include "driver/tcpm/tcpci.h"
#include "gpio.h"
#include "hooks.h"
+#include "keyboard_mkbp.h"
#include "keyboard_scan.h"
#include "lid_switch.h"
#include "pi3usb9201.h"
@@ -34,6 +35,8 @@
#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+#define KS_DEBOUNCE_US (30 * MSEC) /* Debounce time for kickstand switch */
+
/* Forward declaration */
static void tcpc_alert_event(enum gpio_signal signal);
static void usb0_evt(enum gpio_signal signal);
@@ -102,9 +105,58 @@ static void board_connect_c0_sbu(enum gpio_signal s)
hook_call_deferred(&board_connect_c0_sbu_deferred_data, 0);
}
+static int debounced_ks_attached;
+static int debounced_ks_open;
+
+/**
+ * Kickstand switch initialization
+ */
+static void ks_init(void)
+{
+ debounced_ks_attached = !gpio_get_level(GPIO_KS_ATTACHED_L);
+ debounced_ks_open = gpio_get_level(GPIO_KS_OPEN);
+
+ /* Enable interrupts, now that we've initialized */
+ gpio_enable_interrupt(GPIO_KS_ATTACHED_L);
+ gpio_enable_interrupt(GPIO_KS_OPEN);
+}
+DECLARE_HOOK(HOOK_INIT, ks_init, HOOK_PRIO_INIT_SWITCH);
+
+/**
+ * Handle debounced kickstand switch changing state.
+ */
+static void ks_change_deferred(void)
+{
+ const int ks_attached = !gpio_get_level(GPIO_KS_ATTACHED_L);
+ const int ks_open = gpio_get_level(GPIO_KS_OPEN);
+ int proximity_detected;
+
+ /* If the switches haven't changed, nothing to do */
+ if (ks_attached == debounced_ks_attached &&
+ ks_open == debounced_ks_open)
+ return;
+
+ /*
+ * A heuristic method to use the kickstand position to approach
+ * the human body proximity.
+ */
+ proximity_detected = !(ks_attached && ks_open);
+ CPRINTS("ks %s %s -> proximity %s",
+ ks_attached ? "attached" : "detached",
+ ks_open ? "open" : "close",
+ proximity_detected ? "on" : "off");
+
+ debounced_ks_attached = ks_attached;
+ debounced_ks_open = ks_open;
+
+ mkbp_update_switches(EC_MKBP_FRONT_PROXIMITY, proximity_detected);
+}
+DECLARE_DEFERRED(ks_change_deferred);
+
static void ks_interrupt(enum gpio_signal s)
{
- /* TODO(b/168714440): Implement the interrupt */
+ /* Reset kickstand debounce time */
+ hook_call_deferred(&ks_change_deferred_data, KS_DEBOUNCE_US);
}
/* I2C port map */
diff --git a/board/coachz/board.h b/board/coachz/board.h
index 8d37c669f7..072ff42a04 100644
--- a/board/coachz/board.h
+++ b/board/coachz/board.h
@@ -44,12 +44,15 @@
#define CONFIG_TABLET_MODE
#define CONFIG_TABLET_MODE_SWITCH
#define CONFIG_GMR_TABLET_MODE
+#define CONFIG_FRONT_PROXIMITY_SWITCH
/* GPIO alias */
#define GPIO_AC_PRESENT GPIO_CHG_ACOK_OD
#define GPIO_WP_L GPIO_EC_FLASH_WP_ODL
#define GPIO_PMIC_RESIN_L GPIO_PM845_RESIN_L
#define GMR_TABLET_MODE_GPIO_L GPIO_LID_360_L
+#define GPIO_KS_ATTACHED_L GPIO_LID_INT_N_HALL1
+#define GPIO_KS_OPEN GPIO_LID_INT_N_HALL2
#ifndef __ASSEMBLER__