[U-Boot] [PATCH 2/2] allow LED initialization without STATUS_LED_BOOT

Bernhard Nortmann bernhard.nortmann at web.de
Fri Aug 21 15:13:21 CEST 2015


For current U-Boot to initialize status LEDs via status_led_init(), it
is required to have both CONFIG_STATUS_LED and STATUS_LED_BOOT defined.
This may be a particular concern with GPIO LEDs, where __led_init() is
required to correctly set up the GPIO (gpio_request and
gpio_direction_output). Without STATUS_LED_BOOT the initialization isn't
called, which could leave the user with a non-functional "led" command -
due to the fact that the LED routines in gpio_led.c use gpio_set_value()
just fine, but the GPIO never got set up properly in the first place.

I think having CONFIG_STATUS_LED is sufficient to justify a
corresponding call to status_led_init(), even with no STATUS_LED_BOOT
defined. To do so, common/board_r.c needs call that routine, so it now
is exposed via status_led.h.

Signed-off-by: Bernhard Nortmann <bernhard.nortmann at web.de>
---

 common/board_r.c          | 9 ++++++---
 drivers/misc/status_led.c | 2 +-
 include/status_led.h      | 1 +
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/common/board_r.c b/common/board_r.c
index bf6c725..d1e3bf2 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -539,11 +539,14 @@ static int initr_kgdb(void)
 }
 #endif
 
-#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
+#if defined(CONFIG_STATUS_LED)
 static int initr_status_led(void)
 {
+#if defined(STATUS_LED_BOOT)
 	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
-
+#else
+	status_led_init();
+#endif
 	return 0;
 }
 #endif
@@ -830,7 +833,7 @@ init_fnc_t init_sequence_r[] = {
 	|| defined(CONFIG_M68K)
 	timer_init,		/* initialize timer */
 #endif
-#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
+#if defined(CONFIG_STATUS_LED)
 	initr_status_led,
 #endif
 	/* PPC has a udelay(20) here dating from 2002. Why? */
diff --git a/drivers/misc/status_led.c b/drivers/misc/status_led.c
index 9869d98..31e8831 100644
--- a/drivers/misc/status_led.c
+++ b/drivers/misc/status_led.c
@@ -73,7 +73,7 @@ led_dev_t led_dev[] = {
 
 static int status_led_init_done = 0;
 
-static void status_led_init (void)
+void status_led_init(void)
 {
 	led_dev_t *ld;
 	int i;
diff --git a/include/status_led.h b/include/status_led.h
index a5e35df..b0ff274 100644
--- a/include/status_led.h
+++ b/include/status_led.h
@@ -23,6 +23,7 @@
 #define STATUS_LED_BLINKING	1
 #define STATUS_LED_ON		2
 
+void status_led_init(void);
 void status_led_tick (unsigned long timestamp);
 void status_led_set  (int led, int state);
 
-- 
2.4.6



More information about the U-Boot mailing list