
This patch removes the "status_led_init_done" global variable. By removing that variable, it is possible to use LEDs early in SPL, in architectures where .BSS is placed in DRAM area. (For example A20 series)
Signed-off-by: Javad Rahimi javad321javad@gmail.com ---
Changes in v2: - "initialized" variable removed from "led_dev_t" - "state" variable is used as initialization flag - Helper macros defined for initialization - Initialization is checked at begining of LED operations
drivers/misc/status_led.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/drivers/misc/status_led.c b/drivers/misc/status_led.c index 7d30355423..23d932ec6e 100644 --- a/drivers/misc/status_led.c +++ b/drivers/misc/status_led.c @@ -23,7 +23,6 @@ typedef struct { int state; int period; int cnt; - int initialized:1; } led_dev_t;
led_dev_t led_dev[] = { @@ -31,14 +30,12 @@ led_dev_t led_dev[] = { CONFIG_LED_STATUS_STATE, LED_STATUS_PERIOD, 0, - 0, }, #if defined(CONFIG_LED_STATUS1) { CONFIG_LED_STATUS_BIT1, CONFIG_LED_STATUS_STATE1, LED_STATUS_PERIOD1, 0, - 0, }, #endif #if defined(CONFIG_LED_STATUS2) @@ -46,7 +43,6 @@ led_dev_t led_dev[] = { CONFIG_LED_STATUS_STATE2, LED_STATUS_PERIOD2, 0, - 0, }, #endif #if defined(CONFIG_LED_STATUS3) @@ -54,7 +50,6 @@ led_dev_t led_dev[] = { CONFIG_LED_STATUS_STATE3, LED_STATUS_PERIOD3, 0, - 0, }, #endif #if defined(CONFIG_LED_STATUS4) @@ -62,7 +57,6 @@ led_dev_t led_dev[] = { CONFIG_LED_STATUS_STATE4, LED_STATUS_PERIOD4, 0, - 0, }, #endif #if defined(CONFIG_LED_STATUS5) @@ -70,13 +64,17 @@ led_dev_t led_dev[] = { CONFIG_LED_STATUS_STATE5, LED_STATUS_PERIOD5, 0, - 0, }, #endif };
#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) +#define LED_INITIALIZED_BIT 0x8 +#define LED_STATE_MASK 0x3
+#define LED_IS_INITIALIZED(x) (!!((x) & LED_INITIALIZED_BIT)) +#define LED_INITIALIZE(x) ((x) |= (LED_INITIALIZED_BIT)) +#define LED_GET_STATE(x) ((x) & LED_STATE_MASK)
void status_led_init(void) { @@ -85,11 +83,8 @@ void status_led_init(void)
for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) { __led_init (ld->mask, ld->state); - ld->initialized = 1; + LED_INITIALIZE(ld->state); } - - return 0; - }
void status_led_tick(ulong timestamp) @@ -99,8 +94,8 @@ void status_led_tick(ulong timestamp)
for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) {
- if (!ld->initialized) - continue; + if (!LED_IS_INITIALIZED(ld->state)) + status_led_init();
if (ld->state != CONFIG_LED_STATUS_BLINKING) continue; @@ -109,7 +104,6 @@ void status_led_tick(ulong timestamp) __led_toggle (ld->mask); ld->cnt -= ld->period; } - } }
@@ -122,10 +116,10 @@ void status_led_set(int led, int state)
ld = &led_dev[led];
- if (!ld->initialized) - return; + if (!LED_IS_INITIALIZED(ld->state)) + status_led_init();
- ld->state = state; + ld->state = LED_GET_STATE(ld->state); if (state == CONFIG_LED_STATUS_BLINKING) { ld->cnt = 0; /* always start with full period */ state = CONFIG_LED_STATUS_ON; /* always start with LED _ON_ */