This series makes it possible for the LED core to manage the power supply
of a LED. It uses the regulator API to disable/enable the power if when the
LED is turned on/off.
This is especially useful in situations where the LED driver/controller is
not supplying the power.
Because updating a regulator state can block, it is always a defered job.
Note: this series relies on led_cdev->dev->of_node being populated [0]
[0] https://lkml.org/lkml/2019/10/3/139
changes in v6:
- Introduce a new property in DT binding to delay turning OFF the regulator
The idea is to keep the regulator ON for some time after the LED is turned
off in order to not change the regulator state when the LED is blinking.
- Use an atomic to track the state of the regulator to ensure consistency.
- Remove changes in led_set_brightness_sync().
changes in v5:
- fixed build error in led_set_brightness_sync(). Explain the role of
flush__work()
changes in v4:
- Add a new patch to make led_set_brightness_sync() use
led_set_brightness_nosleep() and then wait the work to be done
- Rework how the core knows how the regulator needs to be updated.
changes in v3:
- reword device-tree description
- reword commit log
- remove regulator updates from functions used in atomic context. If the
regulator must be updated, it is defered to a workqueue.
- Fix led_set_brightness_sync() to work with the non-blocking function
__led_set_brightness()
changes in v2:
- use devm_regulator_get_optional() to avoid using the dummy regulator and
do some unnecessary work
Jean-Jacques Hiblot (2):
dt-bindings: leds: document the "power-supply" property
leds: Add control of the voltage/current regulator to the LED core
.../devicetree/bindings/leds/common.txt | 14 ++
drivers/leds/led-class.c | 21 +++
drivers/leds/led-core.c | 122 +++++++++++++++++-
drivers/leds/leds.h | 18 +++
include/linux/leds.h | 8 ++
5 files changed, 181 insertions(+), 2 deletions(-)
--
2.17.1
Most of the LEDs are powered by a voltage/current regulator. Describing it
in the device-tree makes it possible for the LED core to enable/disable it
when needed.
Signed-off-by: Jean-Jacques Hiblot <[email protected]>
---
Documentation/devicetree/bindings/leds/common.txt | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/Documentation/devicetree/bindings/leds/common.txt b/Documentation/devicetree/bindings/leds/common.txt
index 9fa6f9795d50..28c0cbb7c6ab 100644
--- a/Documentation/devicetree/bindings/leds/common.txt
+++ b/Documentation/devicetree/bindings/leds/common.txt
@@ -77,6 +77,19 @@ Optional properties for child nodes:
- panic-indicator : This property specifies that the LED should be used,
if at all possible, as a panic indicator.
+- power-supply : A voltage/current regulator used to to power the LED. When a
+ LED is turned off, the LED core disable its regulator. The
+ same regulator can power many LED (or other) devices. It is
+ turned off only when all of its users disabled it.
+
+- power-off-delays-ms: This property specifies the delay between the time a LED
+ is turned off and the time the regulator is turned off.
+ It can be used to limit the overhead of the regulator
+ handling if the LED is toggling fast.
+ ex: if power-off-delays-ms is set to 500 ms, the
+ regulator will not be turned off until the LED is turned
+ off for more than 500ms.
+
- trigger-sources : List of devices which should be used as a source triggering
this LED activity. Some LEDs can be related to a specific
device and should somehow indicate its state. E.g. USB 2.0
@@ -124,6 +137,7 @@ led-controller@0 {
function = LED_FUNCTION_STATUS;
linux,default-trigger = "heartbeat";
gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
+ power-supply = <&led_regulator>;
};
led1 {
--
2.17.1