summaryrefslogtreecommitdiff
path: root/board/nocturne_fp/board_ro.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/nocturne_fp/board_ro.c')
-rw-r--r--board/nocturne_fp/board_ro.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/board/nocturne_fp/board_ro.c b/board/nocturne_fp/board_ro.c
new file mode 100644
index 0000000000..7f20002435
--- /dev/null
+++ b/board/nocturne_fp/board_ro.c
@@ -0,0 +1,77 @@
+/* Copyright 2017 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+/* Meowth Fingerprint MCU configuration */
+
+#include "common.h"
+#include "hooks.h"
+#include "registers.h"
+#include "spi.h"
+#include "system.h"
+#include "task.h"
+
+#ifndef SECTION_IS_RO
+#error "This file should only be built for RO."
+#endif
+
+
+/**
+ * Disable restricted commands when the system is locked.
+ *
+ * @see console.h system.c
+ */
+int console_is_restricted(void)
+{
+ return system_is_locked();
+}
+
+#include "gpio_list.h"
+
+static void ap_deferred(void)
+{
+ /*
+ * Behavior:
+ * AP Active (ex. Intel S0): SLP_L is 1
+ * AP Suspend (ex. Intel S0ix): SLP_L is 0
+ * The alternative SLP_ALT_L should be pulled high at all the times.
+ *
+ * Legacy Intel behavior:
+ * in S3: SLP_ALT_L is 0 and SLP_L is X.
+ * in S0ix: SLP_ALT_L is X and SLP_L is 0.
+ * in S0: SLP_ALT_L is 1 and SLP_L is 1.
+ * in S5/G3, the FP MCU should not be running.
+ */
+ int running = gpio_get_level(GPIO_SLP_ALT_L) &&
+ gpio_get_level(GPIO_SLP_L);
+
+ if (running) { /* AP is S0 */
+ disable_sleep(SLEEP_MASK_AP_RUN);
+ hook_notify(HOOK_CHIPSET_RESUME);
+ } else { /* AP is suspend/S0ix/S3 */
+ hook_notify(HOOK_CHIPSET_SUSPEND);
+ enable_sleep(SLEEP_MASK_AP_RUN);
+ }
+}
+DECLARE_DEFERRED(ap_deferred);
+
+/* PCH power state changes */
+void slp_event(enum gpio_signal signal)
+{
+ hook_call_deferred(&ap_deferred_data, 0);
+}
+
+void board_init(void)
+{
+ /* Enable interrupt on PCH power signals */
+ gpio_enable_interrupt(GPIO_SLP_ALT_L);
+ gpio_enable_interrupt(GPIO_SLP_L);
+
+ /*
+ * Enable the SPI slave interface if the PCH is up.
+ * Do not use hook_call_deferred(), because ap_deferred() will be
+ * called after tasks with priority higher than HOOK task (very late).
+ */
+ ap_deferred();
+}
+DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);