summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/i2c/ww_ring/Kconfig1
-rw-r--r--src/drivers/i2c/ww_ring/ww_ring.c13
-rw-r--r--src/drivers/i2c/ww_ring/ww_ring.h18
-rw-r--r--src/mainboard/google/storm/chromeos.c14
4 files changed, 28 insertions, 18 deletions
diff --git a/src/drivers/i2c/ww_ring/Kconfig b/src/drivers/i2c/ww_ring/Kconfig
index 67a12eb50b..c671871031 100644
--- a/src/drivers/i2c/ww_ring/Kconfig
+++ b/src/drivers/i2c/ww_ring/Kconfig
@@ -1,3 +1,2 @@
config DRIVERS_I2C_WW_RING
bool
- depends on CHROMEOS
diff --git a/src/drivers/i2c/ww_ring/ww_ring.c b/src/drivers/i2c/ww_ring/ww_ring.c
index e1f255a858..243543a021 100644
--- a/src/drivers/i2c/ww_ring/ww_ring.c
+++ b/src/drivers/i2c/ww_ring/ww_ring.c
@@ -114,7 +114,7 @@ typedef struct {
/* A structure to bind controller programs to a vboot state. */
typedef struct {
- enum VbScreenType_t vb_screen;
+ enum display_pattern led_pattern;
const TiLp55231Program * programs[WW_RING_NUM_LED_CONTROLLERS];
} WwRingStateProg;
@@ -143,8 +143,7 @@ static const WwRingStateProg state_programs[] = {
* for test purposes the blank screen program is set to blinking, will
* be changed soon.
*/
- {VB_SCREEN_BLANK, {&led_blink_program, &led_blink_program} },
- /* Other vboot state programs are coming. */
+ {WWR_ALL_OFF, {&led_blink_program, &led_blink_program} },
};
/* */
/****************************************************************/
@@ -388,7 +387,7 @@ static int ledc_init_validate(TiLp55231 *ledc)
* Find a program matching screen type, and run it on both controllers, if
* found.
*/
-int ww_ring_display_pattern(unsigned i2c_bus, enum VbScreenType_t screen_type)
+int ww_ring_display_pattern(unsigned i2c_bus, enum display_pattern pattern)
{
int i;
static int initted;
@@ -399,7 +398,7 @@ int ww_ring_display_pattern(unsigned i2c_bus, enum VbScreenType_t screen_type)
}
for (i = 0; i < ARRAY_SIZE(state_programs); i++)
- if (state_programs[i].vb_screen == screen_type) {
+ if (state_programs[i].led_pattern == pattern) {
int j;
for (j = 0; j < WW_RING_NUM_LED_CONTROLLERS; j++) {
@@ -411,8 +410,8 @@ int ww_ring_display_pattern(unsigned i2c_bus, enum VbScreenType_t screen_type)
return 0;
}
- printk(BIOS_WARNING, "%s: did not find program for screen %d\n",
- __func__, screen_type);
+ printk(BIOS_WARNING, "%s: did not find program for pattern %d\n",
+ __func__, pattern);
return -1;
}
diff --git a/src/drivers/i2c/ww_ring/ww_ring.h b/src/drivers/i2c/ww_ring/ww_ring.h
index 628cd6c504..d2804ed46e 100644
--- a/src/drivers/i2c/ww_ring/ww_ring.h
+++ b/src/drivers/i2c/ww_ring/ww_ring.h
@@ -14,17 +14,21 @@
#ifndef __SRC_DRIVERS_VIDEO_WW_RING__H__
#define __SRC_DRIVERS_VIDEO_WW_RING__H__
-#if IS_ENABLED(CONFIG_CHROMEOS)
-#include <vboot_api.h>
-
+/*
+ * Different types of display patterns to be shown by the LED ring while
+ * contrlled by coreboot.
+ */
+enum display_pattern {
+ WWR_ALL_OFF, /* Turn the LEDs off. */
+ WWR_RECOVERY_PUSHED, /* Recovery button push detected on start up. */
+ WWR_WIPEOUT_REQUEST, /* Held long enough for wipout request. */
+ WWR_RECOVERY_REQUEST, /* Held long enough for recovery request. */
+};
/*
* ww_ring_display_pattern
*
* Display pattern on the ring LEDs.
*/
-int ww_ring_display_pattern(unsigned i2c_bus, enum VbScreenType_t screen_type);
+int ww_ring_display_pattern(unsigned i2c_bus, enum display_pattern pattern);
-#else
-static inline int ww_ring_display_pattern(unsigned i2c_bus, int screen_type) { return 0;}
-#endif
#endif
diff --git a/src/mainboard/google/storm/chromeos.c b/src/mainboard/google/storm/chromeos.c
index d424f30842..044820640d 100644
--- a/src/mainboard/google/storm/chromeos.c
+++ b/src/mainboard/google/storm/chromeos.c
@@ -84,6 +84,12 @@ enum switch_state {
wipeout_req
};
+static void display_pattern(int pattern)
+{
+ if (board_id() == BOARD_ID_WHIRLWIND_SP5)
+ ww_ring_display_pattern(GSBI_ID_7, pattern);
+}
+
#define WIPEOUT_MODE_DELAY_MS (8 * 1000)
#define RECOVERY_MODE_EXTRA_DELAY_MS (8 * 1000)
@@ -103,7 +109,9 @@ static enum switch_state get_switch_state(void)
return saved_state;
}
+ display_pattern(WWR_RECOVERY_PUSHED);
printk(BIOS_INFO, "recovery button pressed\n");
+
stopwatch_init_msecs_expire(&sw, WIPEOUT_MODE_DELAY_MS);
do {
@@ -113,9 +121,7 @@ static enum switch_state get_switch_state(void)
} while (!stopwatch_expired(&sw));
if (sampled_value) {
- if (board_id() == BOARD_ID_WHIRLWIND_SP5)
- ww_ring_display_pattern(GSBI_ID_7, 0);
-
+ display_pattern(WWR_WIPEOUT_REQUEST);
printk(BIOS_INFO, "wipeout requested, checking recovery\n");
stopwatch_init_msecs_expire(&sw, RECOVERY_MODE_EXTRA_DELAY_MS);
do {
@@ -126,12 +132,14 @@ static enum switch_state get_switch_state(void)
if (sampled_value) {
saved_state = recovery_req;
+ display_pattern(WWR_RECOVERY_REQUEST);
printk(BIOS_INFO, "recovery requested\n");
} else {
saved_state = wipeout_req;
}
} else {
saved_state = no_req;
+ display_pattern(WWR_ALL_OFF);
}
return saved_state;