summaryrefslogtreecommitdiff
path: root/chip/g/rbox.c
diff options
context:
space:
mode:
authorMary Ruthven <mruthven@chromium.org>2016-04-21 12:35:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-04-29 16:07:13 -0700
commit61e065326117f6aef474164a6a42fa0e50eeb096 (patch)
treed71d82b1e45a045fcecae1dea7e2c85f8457943c /chip/g/rbox.c
parent43a0c703465d22cadff185792ba34932c4b4ba3f (diff)
downloadchrome-ec-61e065326117f6aef474164a6a42fa0e50eeb096.tar.gz
cr50: add basic rbox support
This change modifies the behavior of RBOX by blocking the key0 and key1 output, when the power button is pressed. It also adds support for printing debug statements when various RBOX interrupts are triggered. BUG=none BRANCH=none TEST=On cr50 test board verify key0 and key1 out are not asserted unless the power button is pressed. Change-Id: I67a3c1b8009279015bdc87bcf0995cffa9ab6f03 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/341470 Tested-by: Bill Richardson <wfrichar@chromium.org> Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Diffstat (limited to 'chip/g/rbox.c')
-rw-r--r--chip/g/rbox.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/chip/g/rbox.c b/chip/g/rbox.c
new file mode 100644
index 0000000000..56c58b72df
--- /dev/null
+++ b/chip/g/rbox.c
@@ -0,0 +1,88 @@
+/* Copyright 2016 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.
+ */
+
+#include "clock.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "rbox.h"
+#include "task.h"
+
+#ifdef CONFIG_RBOX_DEBUG
+RBOX_INT(KEY0_IN_FED, "KEY0 pressed");
+RBOX_INT(KEY0_IN_RED, "KEY0 released");
+RBOX_INT(KEY1_IN_FED, "KEY1 pressed");
+RBOX_INT(KEY1_IN_RED, "KEY1 released");
+RBOX_INT(PWRB_IN_FED, "PWRB pressed");
+RBOX_INT(PWRB_IN_RED, "PWRB released");
+RBOX_INT(EC_RST_RED, "EC RST rising");
+RBOX_INT(EC_RST_FED, "EC RST falling");
+RBOX_INT(AC_PRESENT_RED, "AC attached");
+RBOX_INT(AC_PRESENT_FED, "AC detached");
+
+RBOX_INT(BUTTON_COMBO0_RDY, "COMBO0");
+RBOX_INT(BUTTON_COMBO1_RDY, "COMBO1");
+RBOX_INT(BUTTON_COMBO2_RDY, "COMBO2");
+
+static void enable_interrupts(void)
+{
+ ENABLE_INT_RF(ENTERING_RW);
+ ENABLE_INT_RF(AC_PRESENT);
+ ENABLE_INT_RF(PWRB_IN);
+ ENABLE_INT_RF(KEY1_IN);
+ ENABLE_INT_RF(KEY0_IN);
+ ENABLE_INT_RF(EC_RST);
+ ENABLE_INT(BUTTON_COMBO0_RDY);
+ ENABLE_INT(BUTTON_COMBO1_RDY);
+ ENABLE_INT(BUTTON_COMBO2_RDY);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_AC_PRESENT_FED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_AC_PRESENT_RED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_PWRB_IN_FED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_PWRB_IN_RED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY0_IN_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY0_IN_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY1_IN_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY1_IN_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_EC_RST_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_EC_RST_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO0_RDY_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO1_RDY_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO2_RDY_INT);
+}
+#endif
+
+void rbox_init(void)
+{
+ /* Enable RBOX */
+ clock_enable_module(MODULE_RBOX, 1);
+
+ /* Clear existing interrupts */
+ GWRITE(RBOX, WAKEUP_CLEAR, 1);
+ GWRITE(RBOX, INT_STATE, 1);
+
+ /* Make sure fuse override is not already enabled */
+ GWRITE(RBOX, FUSE_CTRL, 0);
+
+ /* Block output from key0 and 1 when power button is pressed */
+ GWRITE_FIELD(RBOX, DEBUG_BLOCK_OUTPUT, KEY0_SEL, 1);
+ GWRITE_FIELD(RBOX, DEBUG_BLOCK_OUTPUT, KEY1_SEL, 1);
+
+ /* Increase debounce */
+ GWRITE_FIELD(RBOX, DEBUG_DEBOUNCE, PERIOD, 15);
+
+ /* Enable debug override */
+ GWRITE_FIELD(RBOX, FUSE_CTRL, OVERRIDE_FUSE, 1);
+ GWRITE_FIELD(RBOX, FUSE_CTRL, OVERRIDE_FUSE_READY, 1);
+
+#ifdef CONFIG_RBOX_DEBUG
+ enable_interrupts();
+#endif
+}
+DECLARE_HOOK(HOOK_INIT, rbox_init, HOOK_PRIO_DEFAULT);