g: override RBOX fuses for correct POR behavior

Sanity tested by powering up cr50 and checking for correct RBOX
register values.

This patch is mainly to address RBOX debounce issues and key blocking
while EC_RST is asserted.  A debounce value less than 4, sometimes
causes initial pin values to be incorrectly detected.  The latter is
related to https://chromium-review.googlesource.com/#/c/357590/.

As RBOX controls cannot be selectively bypassed (they have to be
bypassed as a group), all registers are set up in this patch

BUG=chrome-os-partner:54602
BRANCH=None
CQ-DEPEND=CL:377621
TEST=manual on Kevin

Do three-finger salute, enter recovery mode.

Change-Id: Ieb82c94fa33888ead359a77bf77981567998b3fc
Signed-off-by: Timothy Chen <timothytim@google.com>
Reviewed-on: https://chromium-review.googlesource.com/372001
Commit-Ready: Bill Richardson <wfrichar@chromium.org>
Tested-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
This commit is contained in:
Bill Richardson
2016-08-29 17:01:49 -07:00
committed by chrome-bot
parent 60fc54854c
commit b9a55a09ec

View File

@@ -28,5 +28,51 @@ static void rbox_init(void)
/* Clear any wakeup bits (write 0x2, then 0x0) */
GREG32(RBOX, WAKEUP) = GC_RBOX_WAKEUP_CLEAR_MASK;
GREG32(RBOX, WAKEUP) = 0;
/* Override rbox fuses and setup correct behavior */
GWRITE(RBOX, DEBUG_CLK10HZ_COUNT, 0x63ff);
GWRITE(RBOX, DEBUG_SHORT_DELAY_COUNT, 0x4ff);
GWRITE(RBOX, DEBUG_LONG_DELAY_COUNT, 0x31);
GWRITE(RBOX, DEBUG_DEBOUNCE, 0x4);
GWRITE(RBOX, DEBUG_KEY_COMBO0, 0xC0);
GWRITE(RBOX, DEBUG_KEY_COMBO1, 0x0);
GWRITE(RBOX, DEBUG_KEY_COMBO2, 0x0);
/* DEBUG_BLOCK_OUTPUT value should be 0x7 */
GWRITE(RBOX, DEBUG_BLOCK_OUTPUT,
GC_RBOX_DEBUG_BLOCK_OUTPUT_KEY0_SEL_MASK |
GC_RBOX_DEBUG_BLOCK_OUTPUT_KEY1_SEL_MASK |
GC_RBOX_DEBUG_BLOCK_OUTPUT_KEY0_VAL_MASK);
/* DEBUG_POL value should be 0x21 */
GWRITE(RBOX, DEBUG_POL,
0x1 << GC_RBOX_DEBUG_POL_AC_PRESENT_LSB |
0x0 << GC_RBOX_DEBUG_POL_PWRB_IN_LSB |
0x0 << GC_RBOX_DEBUG_POL_PWRB_OUT_LSB |
0x0 << GC_RBOX_DEBUG_POL_KEY0_IN_LSB |
0x0 << GC_RBOX_DEBUG_POL_KEY0_OUT_LSB |
0x1 << GC_RBOX_DEBUG_POL_KEY1_IN_LSB |
0x0 << GC_RBOX_DEBUG_POL_KEY1_OUT_LSB |
0x0 << GC_RBOX_DEBUG_POL_EC_RST_LSB |
0x0 << GC_RBOX_DEBUG_POL_BATT_DISABLE_LSB);
/* DEBUG_TERM value should be 0x1204 */
GWRITE(RBOX, DEBUG_TERM,
0x0 << GC_RBOX_DEBUG_TERM_AC_PRESENT_LSB |
0x1 << GC_RBOX_DEBUG_TERM_ENTERING_RW_LSB |
0x0 << GC_RBOX_DEBUG_TERM_PWRB_IN_LSB |
0x0 << GC_RBOX_DEBUG_TERM_PWRB_OUT_LSB |
0x2 << GC_RBOX_DEBUG_TERM_KEY0_IN_LSB |
0x0 << GC_RBOX_DEBUG_TERM_KEY0_OUT_LSB |
0x1 << GC_RBOX_DEBUG_TERM_KEY1_IN_LSB |
0x0 << GC_RBOX_DEBUG_TERM_KEY1_IN_LSB);
/* DEBUG_BLOCK_OUTPUT value should be 0x157 */
GWRITE(RBOX, DEBUG_DRIVE,
0x3 << GC_RBOX_DEBUG_DRIVE_PWRB_OUT_LSB |
0x1 << GC_RBOX_DEBUG_DRIVE_KEY0_OUT_LSB |
0x1 << GC_RBOX_DEBUG_DRIVE_KEY1_OUT_LSB |
0x1 << GC_RBOX_DEBUG_DRIVE_EC_RST_LSB |
0x1 << GC_RBOX_DEBUG_DRIVE_BATT_DISABLE_LSB);
/* FUSE_CTRL value should be 0x3 */
GWRITE(RBOX, FUSE_CTRL,
GC_RBOX_FUSE_CTRL_OVERRIDE_FUSE_MASK |
GC_RBOX_FUSE_CTRL_OVERRIDE_FUSE_READY_MASK);
}
DECLARE_HOOK(HOOK_INIT, rbox_init, HOOK_PRIO_DEFAULT - 1);