summaryrefslogtreecommitdiff
path: root/board/hatch_fp/board_rw.c
diff options
context:
space:
mode:
authorHsu Wei-Cheng <mojahsu@chromium.org>2021-08-06 08:32:44 +0000
committerHsu Wei-Cheng <mojahsu@chromium.org>2021-08-06 09:21:55 +0000
commit53c02958d338f8a4eabd2e5239800d1e7fbac60f (patch)
treeef49313fb86cf79cca0639ae317718f56309d104 /board/hatch_fp/board_rw.c
parentc0121aadfa214f124f20e50c9fe2552f09d77dd1 (diff)
downloadchrome-ec-53c02958d338f8a4eabd2e5239800d1e7fbac60f.tar.gz
Revert "bloonchipper: Reintroduce sleep lines to RO"
This reverts commit 5e2a0808b7dfc736676daf8ba4d6cf683076d961. Reason for revert: It may broke CQ BUG=b:195718112 Original change's description: > bloonchipper: Reintroduce sleep lines to RO > > Change https://crrev.com/c/2673909 removed the sleep lines from RO > in an effort to minimize the RO complexity. > Most notably, this isolated the deep-sleep/low-power-idle > logic to RW only. > > Unfortunately, the sleep lines also control whether the SPI host interface > is listening, which allows it to ignore spurious communication. > > It seems safer to reinstate the the sleep line with low power idle > active and directly disable CONFIG_LOW_POWER_IDLE in subsequent CL. > > We reinstate the sleep line gpio logic from the following: > https://crrev.com/c5545464431669029f42829d542fa491d767ee5f/board/hatch_fp/board.c > This is the parent commit to the CL that refactors the sleep lines. > > BRANCH=none > BUG=b:178746753 > TEST=# Connect servo_micro to a dragonclaw board. > make proj-bloonchipper -j > sudo servod --board=dragonclaw > ./util/flash_ec --board=bloonchipper > > dut-control fpmcu_slp:off fpmcu_slp_alt:off > dut-control pp3300_dx_mcu_mw # Should be around 20mw > dut-control fpmcu_slp:on fpmcu_slp_alt:off > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:off fpmcu_slp_alt:on > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:on fpmcu_slp_alt:on > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:off fpmcu_slp_alt:off > > minicom -D$(dut-control -o raw_fpmcu_console_uart_pty) > > reboot ro > # Ctrl-A Q > > dut-control fpmcu_slp:off fpmcu_slp_alt:off > dut-control pp3300_dx_mcu_mw # Should be around 20mw > dut-control fpmcu_slp:on fpmcu_slp_alt:off > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:off fpmcu_slp_alt:on > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:on fpmcu_slp_alt:on > dut-control pp3300_dx_mcu_mw # Should be less the 5mw > dut-control fpmcu_slp:off fpmcu_slp_alt:off > > minicom -D$(dut-control -o raw_fpmcu_console_uart_pty) > > reboot > > fpenroll > > fpmatch > > reboot > # Ctrl-A Q > > Signed-off-by: Craig Hesling <hesling@chromium.org> > Change-Id: I503cb3b62740300b265a4ddb165e29d9e36727fd > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3012241 > Commit-Queue: Josie Nordrum <josienordrum@google.com> > Reviewed-by: Josie Nordrum <josienordrum@google.com> Bug: b:178746753 Change-Id: If610fdffaef778f26c712bbad360e84651df61bf Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3077589 Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Owners-Override: Hsu Wei-Cheng <mojahsu@chromium.org> Auto-Submit: Hsu Wei-Cheng <mojahsu@chromium.org>
Diffstat (limited to 'board/hatch_fp/board_rw.c')
-rw-r--r--board/hatch_fp/board_rw.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/board/hatch_fp/board_rw.c b/board/hatch_fp/board_rw.c
index 35709860e3..09c78c5e5c 100644
--- a/board/hatch_fp/board_rw.c
+++ b/board/hatch_fp/board_rw.c
@@ -7,8 +7,10 @@
#include "console.h"
#include "fpsensor_detect.h"
#include "gpio.h"
+#include "hooks.h"
#include "registers.h"
#include "spi.h"
+#include "system.h"
#include "task.h"
#include "usart_host_command.h"
#include "util.h"
@@ -17,6 +19,45 @@
#error "This file should only be built for RW."
#endif
+/*
+ * Some platforms have a broken SLP_S0_L signal (stuck to 0 in S0)
+ * if set, ignore it and only uses SLP_S3_L for the AP state.
+ */
+static bool broken_slp;
+
+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 1 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) || broken_slp);
+
+ if (running) { /* S0 */
+ disable_sleep(SLEEP_MASK_AP_RUN);
+ hook_notify(HOOK_CHIPSET_RESUME);
+ } else { /* 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);
+}
+
/* SPI devices */
struct spi_device_t spi_devices[] = {
/* Fingerprint sensor (SCLK at 4Mhz) */
@@ -46,6 +87,39 @@ static void configure_fp_sensor_spi(void)
void board_init_rw(void)
{
+ enum fp_transport_type ret_transport = get_fp_transport_type();
+
+ /*
+ * FP_RST_ODL pin is defined in gpio_rw.inc (with GPIO_OUT_HIGH
+ * flag) but not in gpio.inc, so RO leaves this pin set to 0 (reset
+ * default), but RW doesn't initialize this pin to 1 because sysjump
+ * to RW is a warm reset (see gpio_pre_init() in chip/stm32/gpio.c).
+ * Explicitly reset FP_RST_ODL pin to default value.
+ */
+ gpio_reset(GPIO_FP_RST_ODL);
+
+ if (ret_transport == FP_TRANSPORT_TYPE_UART) {
+ /*
+ * The Zork variants currently have a broken SLP_S0_L signal
+ * (stuck to 0 in S0). For now, unconditionally ignore it here
+ * as they are the only UART users and the AP has no S0ix state.
+ * TODO(b/174695987) once the RW AP firmware has been updated
+ * on all those machines, remove this workaround.
+ */
+ broken_slp = true;
+ }
+
/* Configure and enable SPI as master for FP sensor */
configure_fp_sensor_spi();
+
+ /* 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();
}