lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251230082336.3308403-4-professorjonny98@gmail.com>
Date: Tue, 30 Dec 2025 21:23:16 +1300
From: Jonathan Brophy <professorjonny98@...il.com>
To: lee Jones <lee@...nel.org>,
	Pavel Machek <pavel@...nel.org>,
	Andriy Shevencho <andriy.shevchenko@...ux.intel.com>,
	Jonathan Brophy <professor_jonny@...mail.com>,
	Rob Herring <robh@...nel.org>,
	Krzysztof Kozlowski <krzk+dt@...nel.org>,
	Conor Dooley <conor+dt@...nel.org>,
	Radoslav Tsvetkov <rtsvetkov@...dotech.eu>
Cc: devicetree@...r.kernel.org,
	linux-kernel@...r.kernel.org,
	linux-leds@...r.kernel.org
Subject: [PATCH v5 3/7] dt-bindings: leds: Add virtual LED group controller bindings

From: Jonathan Brophy <professor_jonny@...mail.com>

Add device tree bindings for the virtual LED group controller that
provides priority-based arbitration for shared physical LEDs across
multiple virtual LED instances.

Bindings for the virtual driver are not describing hardware LEDs they
describe virtual devices made from groups of hardware LEDs created from an array
of LED phandles.

Normally the device tree is used to describe hardware not virtual hardware
but it is particularly useful in situations where you require an LED to be a
specific color by mixing primary colors, such as multi element multi color LEDs
to be operated from a device tree binding or a single trigger.

It also becomes useful with multiple LEDs operating the same indicator such as
ring of light indicators, led rope where the LEDs are driven From different GPIO
outputs unifying the control that can give basic indication during system startup,
shutdown upgrade etc...
The controller implements winner-takes-all arbitration where only the
highest-priority active virtual LED controls the hardware at any given
time. This enables multiple subsystems (boot, error, status indicators)
to request LED control without explicit coordination.

Binding supports:
- Multiple virtual LED children with independent priorities
- GPIO, PWM, I2C, and SPI physical LED devices
- Multicolor and standard (fixed-color) operating modes
- Global ownership tracking to prevent conflicts

Example configurations include:
- High-priority emergency/error RGB indicator
- Medium-priority system state RGBW indicator
- Low-priority warm white fixed-color indicator

Co-developed-by: Radoslav Tsvetkov <rtsvetkov@...dotech.eu>
Signed-off-by: Radoslav Tsvetkov <rtsvetkov@...dotech.eu>
Signed-off-by: Jonathan Brophy <professor_jonny@...mail.com>
---
 .../leds/leds-group-virtualcolor.yaml         | 170 ++++++++++++++++++
 1 file changed, 170 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-group-virtualcolor.yaml

diff --git a/Documentation/devicetree/bindings/leds/leds-group-virtualcolor.yaml b/Documentation/devicetree/bindings/leds/leds-group-virtualcolor.yaml
new file mode 100644
index 000000000000..88c044f42879
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-group-virtualcolor.yaml
@@ -0,0 +1,170 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/leds-group-virtualcolor.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Virtual LED Group Controller with Multicolor Support
+
+maintainers:
+  - Jonathan Brophy <professor_jonny@...mail.com>
+
+description: |
+  The virtual LED group controller provides priority-based arbitration for
+  shared physical LEDs across multiple virtual LED instances. Each virtual LED
+  combines physical monochromatic LEDs into logical units with:
+
+  - Priority-based arbitration: Higher priority virtual LEDs take precedence
+    when multiple virtual LEDs compete for the same physical LEDs
+  - Sequence-based tie-breaking: Among equal priorities, most recent update wins
+  - Winner-takes-all: Only ONE virtual LED controls ALL physical LEDs at any time
+  - Color channel grouping: Organize LEDs by color for multicolor control
+  - Full multicolor ABI support: multi_intensity, multi_index, multi_multipliers
+  - Two operating modes:
+    * Multicolor mode: Dynamic per-channel intensity control (default)
+    * Standard mode: Fixed color ratios via multipliers (brightness only)
+  - Brightness scaling: Master brightness control with per-channel intensity
+  - Global ownership: Physical LEDs claimed exclusively per controller instance
+  - Update batching: Optional coalescing of rapid brightness changes
+
+  Key features:
+  - Supports GPIO, PWM, I2C, and SPI LED devices
+  - Automatic physical LED discovery and claiming
+  - Lock-free arbitration with atomic sequence numbers
+  - Suspend/resume with state preservation
+  - Comprehensive debugfs telemetry (when CONFIG_DEBUG_FS enabled)
+
+  Typical use cases:
+  - System status indicators with boot/update/error priority levels
+  - RGB lighting with priority-based overrides
+  - Multi-element LED arrays unified into single logical controls
+  - LED rings or strips with coordinated color control
+
+properties:
+  compatible:
+    const: leds-group-virtualcolor
+
+  '#address-cells':
+    const: 1
+
+  '#size-cells':
+    const: 0
+
+patternProperties:
+  "^virtual-led@[0-9a-f]+$":
+    type: object
+    $ref: leds-class-virtualcolor.yaml#
+
+required:
+  - compatible
+  - '#address-cells'
+  - '#size-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/leds/common.h>
+    #include <dt-bindings/gpio/gpio.h>
+
+    /* Physical LED definitions */
+    led-controller {
+        compatible = "gpio-leds";
+
+        led_red: led-red {
+            color = <LED_COLOR_ID_RED>;
+            function = LED_FUNCTION_STATUS;
+            gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
+            default-state = "off";
+        };
+
+        led_green: led-green {
+            color = <LED_COLOR_ID_GREEN>;
+            function = LED_FUNCTION_STATUS;
+            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
+            default-state = "off";
+        };
+
+        led_blue: led-blue {
+            color = <LED_COLOR_ID_BLUE>;
+            function = LED_FUNCTION_STATUS;
+            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
+            default-state = "off";
+        };
+
+        led_white: led-white {
+            color = <LED_COLOR_ID_WHITE>;
+            function = LED_FUNCTION_STATUS;
+            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
+            default-state = "off";
+        };
+    };
+
+    pwm-led-controller {
+        compatible = "pwm-leds";
+
+        pwm_red: led-1 {
+            color = <LED_COLOR_ID_RED>;
+            function = LED_FUNCTION_STATUS;
+            pwms = <&pwm 0 7812500>;
+            max-brightness = <255>;
+        };
+
+        pwm_green: led-2 {
+            color = <LED_COLOR_ID_GREEN>;
+            function = LED_FUNCTION_STATUS;
+            pwms = <&pwm 1 7812500>;
+            max-brightness = <255>;
+        };
+
+        pwm_blue: led-3 {
+            color = <LED_COLOR_ID_BLUE>;
+            function = LED_FUNCTION_STATUS;
+            pwms = <&pwm 2 7812500>;
+            max-brightness = <255>;
+        };
+    };
+
+    /* virtual LED definitions */
+    virtual-led-controller {
+        compatible = "leds-group-virtualcolor";
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        /* High-priority RGB virtual LED (emergency/error indicator) */
+        virtual-led@0 {
+            reg = <0>;
+            color = <LED_COLOR_ID_MULTI>;
+            function = LED_FUNCTION_STATUS;
+            priority = <1000>;
+            led-mode = "multicolor";
+            leds = <&led_red>, <&led_green>, <&led_blue>;
+            /* Channels ordered by color ID: [0]=red, [1]=green, [2]=blue */
+        };
+
+        /* Medium-priority RGBW indicator (system state) */
+        virtual-led@1 {
+            reg = <1>;
+            color = <LED_COLOR_ID_MULTI>;
+            function = LED_FUNCTION_STATUS;
+            priority = <500>;
+            led-mode = "multicolor";
+            leds = <&pwm_red>, <&pwm_green>, <&pwm_blue>, <&led_white>;
+            /* Channels: [0]=white (ID=0), [1]=red, [2]=green, [3]=blue */
+        };
+
+        /* Low-priority warm white (fixed color ratios, standard mode) */
+        virtual-led@2 {
+            reg = <2>;
+            color = <LED_COLOR_ID_MULTI>;
+            function = LED_FUNCTION_STATUS;
+            priority = <10>;
+            led-mode = "standard";
+            leds = <&led_red>, <&led_green>, <&led_blue>;
+            /* Channels: [0]=red, [1]=green, [2]=blue */
+            mc-channel-multipliers = <255 180 100>;
+            /* Creates warm white: full red, 70% green, 40% blue */
+        };
+    };
+
+...
--
2.43.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ