Hi! On 18.01.25 14:22, Heiko Schocher wrote:
in linux we have the option to create the name of a led optionally through the following properties:- function - color - function-enumerator This patch adds support for parsing this properties if there is no label property. To be as close as possible to linux import the following files from it: include/dt-bindings/leds/common.h include/linux/uapi/linux/uleds.h base commit was: commit: b8f52214c61a ("Merge tag 'audit-pr-20241205' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit") The led name is created in led_post_bind() and we need some storage place for it. Currently this patch prevents to use malloc() instead it stores the name in new member : char name[LED_MAX_NAME_SIZE]; of struct led_uc_plat. While at it append led tests for the new feature. Signed-off-by: Heiko Schocher <[email protected]> --- as we introduce a new element in struct led_uc_priv, may we should add this functionality through a new Kconfig option? (Which also would make this optional and save some bytes for boards who do not need this...) Ignored a lot of checkpatch warnigs for file include/dt-bindings/leds/common.h WARNING: Block comments use * on subsequent lines +/* Obsolete equivalents: "tpacpi::thinklight" (IBM/Lenovo Thinkpads), + "lp5523:kb{1,2,3,4,5,6}" (Nokia N900) */ WARNING: Block comments use a trailing */ on a separate line + "lp5523:kb{1,2,3,4,5,6}" (Nokia N900) */ WARNING: Block comments use * on subsequent lines +/* System LEDs, usually found on system body. + platform::mute (etc) is sometimes seen, :mute would be better */ WARNING: Block comments use a trailing */ on a separate line + platform::mute (etc) is sometimes seen, :mute would be better */ WARNING: Block comments use * on subsequent lines +/* Used RGB notification LEDs common on phones. + Obsolete equivalents: "status-led:{red,green,blue}" (Motorola Droid 4), WARNING: Block comments use a trailing */ on a separate line + "lp5523:{r,g,b}" (Nokia N900) */ as it is copied from linux commit: b8f52214c61a ("Merge tag 'audit-pr-20241205' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit") Azure build: https://dev.azure.com/hs0298/hs/_build/results?buildId=148&view=results arch/sandbox/dts/test.dts | 37 +++++++- doc/device-tree-bindings/leds/common.txt | 28 ++++++ drivers/led/led-uclass.c | 72 +++++++++++++- include/dt-bindings/leds/common.h | 114 +++++++++++++++++++++++ include/led.h | 2 + include/linux/uapi/linux/uleds.h | 25 +++++ test/dm/led.c | 22 ++++- test/dm/ofnode.c | 2 +- 8 files changed, 295 insertions(+), 7 deletions(-) create mode 100644 include/dt-bindings/leds/common.h create mode 100644 include/linux/uapi/linux/uleds.h
[...]
diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c index 760750568c0..564abf7eaca 100644 --- a/drivers/led/led-uclass.c +++ b/drivers/led/led-uclass.c @@ -13,6 +13,25 @@ #include <dm/lists.h> #include <dm/root.h> #include <dm/uclass-internal.h> +#include <dt-bindings/leds/common.h> + +static const char * const led_colors[LED_COLOR_ID_MAX] = { + [LED_COLOR_ID_WHITE] = "white", + [LED_COLOR_ID_RED] = "red", + [LED_COLOR_ID_GREEN] = "green", + [LED_COLOR_ID_BLUE] = "blue", + [LED_COLOR_ID_AMBER] = "amber", + [LED_COLOR_ID_VIOLET] = "violet", + [LED_COLOR_ID_YELLOW] = "yellow", + [LED_COLOR_ID_IR] = "ir", + [LED_COLOR_ID_MULTI] = "multicolor", + [LED_COLOR_ID_RGB] = "rgb", + [LED_COLOR_ID_PURPLE] = "purple", + [LED_COLOR_ID_ORANGE] = "orange", + [LED_COLOR_ID_PINK] = "pink", + [LED_COLOR_ID_CYAN] = "cyan", + [LED_COLOR_ID_LIME] = "lime", +};int led_bind_generic(struct udevice *parent, const char *driver_name){ @@ -232,11 +251,56 @@ int led_activity_blink(void) #endif #endif-static const char *led_get_label(ofnode node)+static const char *led_get_function_name(struct udevice *dev) +{ + struct led_uc_plat *uc_plat; + const char *func; + u32 color; + u32 enumerator; + int ret; + int cp; + + if (!dev) + return NULL; + + uc_plat = dev_get_uclass_plat(dev); + if (!uc_plat) + return NULL; + + if (uc_plat->label) + return uc_plat->label; + + /* Now try to detect function label name */ + func = dev_read_string(dev, "function"); + cp = dev_read_u32(dev, "color", &color); + if (cp == 0 || func) { + ret = dev_read_u32(dev, "function-enumerator", &enumerator); + if (!ret) { + snprintf(uc_plat->name, LED_MAX_NAME_SIZE, + "%s:%s-%d", + cp ? "" : led_colors[color], + func ? func : "", enumerator); + } else { + snprintf(uc_plat->name, LED_MAX_NAME_SIZE, + "%s:%s", + cp ? "" : led_colors[color], + func ? func : ""); + } + uc_plat->label = uc_plat->name; + } + + return uc_plat->label; +} + +static const char *led_get_label(struct udevice *dev, ofnode node) { const char *label; + const char *name;+ name = ofnode_get_name(node);
name is not used, crap from debug... I remove it in v2, but wait for some comments before posting it. [...] bye, Heiko -- DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: [email protected]

