summaryrefslogtreecommitdiff
path: root/common/tablet_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/tablet_mode.c')
-rw-r--r--common/tablet_mode.c56
1 files changed, 51 insertions, 5 deletions
diff --git a/common/tablet_mode.c b/common/tablet_mode.c
index 4a9a0b2364..d73140c4bf 100644
--- a/common/tablet_mode.c
+++ b/common/tablet_mode.c
@@ -3,9 +3,17 @@
* found in the LICENSE file.
*/
+#include "console.h"
+#include "gpio.h"
#include "hooks.h"
+#include "lid_angle.h"
+#include "tablet_mode.h"
+#include "timer.h"
-/* Return 1 if in tablet mode, 0 otherwise */
+#define CPRINTS(format, args...) cprints(CC_MOTION_LID, format, ## args)
+#define CPRINTF(format, args...) cprintf(CC_MOTION_LID, format, ## args)
+
+/* 1: in tablet mode. 0: otherwise */
static int tablet_mode = 1;
int tablet_get_mode(void)
@@ -15,9 +23,47 @@ int tablet_get_mode(void)
void tablet_set_mode(int mode)
{
- if (tablet_mode != mode) {
- tablet_mode = mode;
- hook_notify(HOOK_TABLET_MODE_CHANGE);
- }
+ if (tablet_mode == mode)
+ return;
+
+ tablet_mode = mode;
+ CPRINTS("tablet mode %sabled\n", mode ? "en" : "dis");
+ hook_notify(HOOK_TABLET_MODE_CHANGE);
+}
+
+/* This ifdef can be removed once we clean up past projects which do own init */
+#ifdef CONFIG_TABLET_SWITCH
+#ifndef TABLET_MODE_GPIO_L
+#error TABLET_MODE_GPIO_L must be defined
+#endif
+static void tablet_mode_debounce(void)
+{
+ /* We won't reach here on boards without a dedicated tablet switch */
+ tablet_set_mode(!gpio_get_level(TABLET_MODE_GPIO_L));
+
+ /* Then, we disable peripherals only when the lid reaches 360 position.
+ * (It's probably already disabled by motion_sense_task.)
+ * We deliberately do not enable peripherals when the lid is leaving
+ * 360 position. Instead, we let motion_sense_task enable it once it
+ * reaches laptop zone (180 or less). */
+ if (tablet_mode)
+ lid_angle_peripheral_enable(0);
+}
+DECLARE_DEFERRED(tablet_mode_debounce);
+
+#define TABLET_DEBOUNCE_US (30 * MSEC) /* Debounce time for tablet switch */
+
+void tablet_mode_isr(enum gpio_signal signal)
+{
+ hook_call_deferred(&tablet_mode_debounce_data, TABLET_DEBOUNCE_US);
}
+static void tablet_mode_init(void)
+{
+ gpio_enable_interrupt(TABLET_MODE_GPIO_L);
+ /* Ensure tablet mode is initialized according to the hardware state
+ * so that the cached state reflects reality. */
+ tablet_mode_debounce();
+}
+DECLARE_HOOK(HOOK_INIT, tablet_mode_init, HOOK_PRIO_DEFAULT);
+#endif