
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 hs@denx.de
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