Recovery mode: Use LEDs to provide visual feedback

Change-Id: Ibc9b6ca538123ff46ae237b45d5654b0c6d326a4
diff --git a/arch/arm/boards/optimus/optimus.c b/arch/arm/boards/optimus/optimus.c
index df19053..004fca8 100644
--- a/arch/arm/boards/optimus/optimus.c
+++ b/arch/arm/boards/optimus/optimus.c
@@ -319,6 +319,14 @@
 uint32_t tpm_init(void);
 #endif
 
+static void gpio_toggle(unsigned int gpiomask) {
+	if (comcerto_gpio_read(gpiomask)) {
+		comcerto_gpio_set_0(gpiomask);
+	} else {
+		comcerto_gpio_set_1(gpiomask);
+	}
+}
+
 static int is_factory_reset_pressed(void) {
 	return !comcerto_gpio_read(GPIO_6);
 }
@@ -331,6 +339,21 @@
 			return 0;
 		}
 
+		// Blink red LED slowly
+		if (i % 50 == 0) {
+			gpio_toggle(GPIO_RED_LED);
+		}
+
+		mdelay(10);
+	}
+
+	// Increase blinking frequency of the LED to indicate that the button can be
+	// released
+	for (i = 0; is_factory_reset_pressed(); i++) {
+		if (i % 20 == 0) {
+			gpio_toggle(GPIO_RED_LED);
+		}
+
 		mdelay(10);
 	}
 
@@ -516,6 +539,12 @@
 			printf("Factory reset button is pressed, checking for recovery mode ...\n");
 			recovery_mode = is_factory_reset_pressed_continuously(5000);
 			printf("Recovery mode is%s active\n", (recovery_mode? "" : " not"));
+
+			if (!recovery_mode) {
+				comcerto_gpio_set_1(GPIO_RED_LED);
+			} else {
+				comcerto_gpio_set_0(GPIO_RED_LED);
+			}
 		}
 
 		if (recovery_mode) {