From: Benjamin Tietz <benja...@micronet24.de>
--- cmd/led.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-)
From: Benjamin Tietz <benja...@micronet24.de> --- cmd/led.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/cmd/led.c b/cmd/led.c index e020b92..99358c6 100644 --- a/cmd/led.c +++ b/cmd/led.c @@ -183,6 +183,54 @@ LED_TBL_STATUS(5, STATUS_LED_BIT5); #define LED_TEST_5(name) while(0) #endif +#ifdef CONFIG_LED +#include <led.h> + +static void _led_dm_onoff(const led_tbl_t *led, enum led_cmd cmd, char *arg) +{ + struct udevice *dev = NULL; + if(led_get_by_label(led->string, &dev)) + return; + if(dev) + led_set_on(dev, cmd == LED_ON); +} + +// this isn't const, as the string will be replaced by the current led's label, always. +static led_tbl_t _led_dm = { + .op = { + [LED_ON] = _led_dm_onoff, + [LED_OFF] = _led_dm_onoff, + [LED_LIST] = _led_list_name, + }, +}; + +static const led_tbl_t *_led_dm_get(const char *name) { + struct udevice *dev = NULL; + if(led_get_by_label(name, &dev)) + return NULL; + if(!dev) + return NULL; + _led_dm.string = name; + return &_led_dm; +} + +#define LED_DM_COUNT() led_count() +static int led_dm_list(const char **tbl, int size) { + struct udevice *devs[size]; + int cnt = led_get_all(devs, size); + int i; + for(i = 0; i < cnt; i++) + tbl[i] = led_get_label(devs[i]); + return cnt; +} +#define LED_TEST_DM(name) return _led_dm_get(name) + +#else +#define LED_TEST_DM(name) return NULL +#define LED_DM_COUNT() 0 +#define led_dm_list(tbl, size) 0 +#endif + static int _led_count(void) { int i = 0; if(LED_NAME_GREEN) i++; @@ -195,6 +243,7 @@ static int _led_count(void) { if(LED_NAME_3) i++; if(LED_NAME_4) i++; if(LED_NAME_5) i++; + i += LED_DM_COUNT(); return i; } @@ -211,6 +260,7 @@ static int _led_list(const char **tbl, int size) { TEST_ADD_NAME(LED_NAME_3, tbl, size); TEST_ADD_NAME(LED_NAME_4, tbl, size); TEST_ADD_NAME(LED_NAME_5, tbl, size); + size -= led_dm_list(tbl, size); return init_size - size; } @@ -248,7 +298,8 @@ static const led_tbl_t *get_led(const char *name) { LED_TEST_3(name); LED_TEST_4(name); LED_TEST_5(name); - return NULL; + // must be last, returns always + LED_TEST_DM(name); } enum led_cmd get_led_cmd(char *var)
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot