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]

Reply via email to