diff mbox series

[RFC] leds: pwm: add flag to start without PWM init

Message ID 20200309082218.13263-1-Denis.Osterland@diehl.com
State New
Headers show
Series [RFC] leds: pwm: add flag to start without PWM init | expand

Commit Message

Denis OSTERLAND-HEIM March 9, 2020, 8:24 a.m. UTC
This patch add "pwm,uninitalized" devicetree flag support to pwm
leds, which allows to defer pwm init to first use of led.

This allows to configure the PWM early in bootloader to let the LED
blink until an application in Linux userspace set something different.

Signed-off-by: Denis Osterland-Heim <Denis.Osterland@diehl.com>
---
Hi,

I want to ask if such a patch is intresting for mainline and
if it is woth to think about how to represent this state to user space.

Regards Denis

 Documentation/devicetree/bindings/leds/leds-pwm.txt |  1 +
 drivers/leds/leds-pwm.c                             | 10 ++++++++--
 include/linux/leds_pwm.h                            |  1 +
 3 files changed, 10 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
index 6c6583c35f2f..4f58df631fc9 100644
--- a/Documentation/devicetree/bindings/leds/leds-pwm.txt
+++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
@@ -19,6 +19,7 @@  LED sub-node properties:
   see Documentation/devicetree/bindings/leds/common.txt
 - linux,default-trigger :  (optional)
   see Documentation/devicetree/bindings/leds/common.txt
+- pwm,uninitalized : defer PWM init to first brightness change of led
 
 Example:
 
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index 8b6965a563e9..02c90f05602a 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -97,7 +97,8 @@  static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
 	 * FIXME: pwm_apply_args() should be removed when switching to the
 	 * atomic PWM API.
 	 */
-	pwm_apply_args(led_data->pwm);
+	if (!led->pwm_uninitialized)
+		pwm_apply_args(led_data->pwm);
 
 	pwm_get_args(led_data->pwm, &pargs);
 
@@ -108,7 +109,9 @@  static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
 	ret = devm_led_classdev_register(dev, &led_data->cdev);
 	if (ret == 0) {
 		priv->num_leds++;
-		led_pwm_set(&led_data->cdev, led_data->cdev.brightness);
+		if (!led->pwm_uninitialized)
+			led_pwm_set(&led_data->cdev,
+					led_data->cdev.brightness);
 	} else {
 		dev_err(dev, "failed to register PWM led for %s: %d\n",
 			led->name, ret);
@@ -143,6 +146,9 @@  static int led_pwm_create_fwnode(struct device *dev, struct led_pwm_priv *priv)
 		fwnode_property_read_u32(fwnode, "max-brightness",
 					 &led.max_brightness);
 
+		led.pwm_uninitialized = fwnode_property_read_bool(fwnode,
+							"pwm,uninitialized");
+
 		ret = led_pwm_add(dev, priv, &led, fwnode);
 		if (ret) {
 			fwnode_handle_put(fwnode);
diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
index 93d101d28943..0b04dfd43654 100644
--- a/include/linux/leds_pwm.h
+++ b/include/linux/leds_pwm.h
@@ -10,6 +10,7 @@  struct led_pwm {
 	const char	*default_trigger;
 	unsigned	pwm_id __deprecated;
 	u8 		active_low;
+	u8		pwm_uninitialized;
 	unsigned 	max_brightness;
 	unsigned	pwm_period_ns;
 };