LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH v8 0/2] leds: pwm: add support for default-state device
@ 2021-06-08  6:35 Denis Osterland-Heim
  2021-06-08  6:35 ` [PATCH v8 1/2] leds: move default_state read from fwnode to core Denis Osterland-Heim
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Denis Osterland-Heim @ 2021-06-08  6:35 UTC (permalink / raw)
  To: Pavel Machek; +Cc: denis.osterland, linux-leds, linux-kernel

v7 -> v8:
 - apply and test on newest kernel
 - drop docu patch, because it is already documented

Denis Osterland-Heim (2):
      leds: move default_state read from fwnode to core
      leds: pwm: add support for default-state device property

 drivers/leds/led-core.c  | 15 +++++++++++++++
 drivers/leds/leds-gpio.c | 12 ++----------
 drivers/leds/leds.h      |  1 +
 include/linux/leds.h     | 12 +++++++++---
 4 files changed, 27 insertions(+), 13 deletions(-)

Message-Id: <20200731164945.19515-1-Denis.Osterland@diehl.com>
base-commit: e90abb95bc71566e2016964e98181557929f55f5



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v8 1/2] leds: move default_state read from fwnode to core
  2021-06-08  6:35 [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
@ 2021-06-08  6:35 ` Denis Osterland-Heim
  2021-06-08  6:35 ` [PATCH v8 2/2] leds: pwm: add support for default-state device property Denis Osterland-Heim
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Osterland-Heim @ 2021-06-08  6:35 UTC (permalink / raw)
  To: Pavel Machek
  Cc: denis.osterland, linux-leds, linux-kernel, Denis Osterland-Heim

From: Denis Osterland-Heim <Denis.Osterland@diehl.com>

This patch introduces a new function to read initial
default_state from fwnode.

Suggested-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Denis Osterland-Heim <Denis.Osterland@diehl.com>
---
 drivers/leds/led-core.c  | 15 +++++++++++++++
 drivers/leds/leds-gpio.c | 12 ++----------
 drivers/leds/leds.h      |  1 +
 include/linux/leds.h     | 12 +++++++++---
 4 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
index 8eb8054ef9c6..4a97cb745788 100644
--- a/drivers/leds/led-core.c
+++ b/drivers/leds/led-core.c
@@ -477,3 +477,18 @@ int led_compose_name(struct device *dev, struct led_init_data *init_data,
 	return 0;
 }
 EXPORT_SYMBOL_GPL(led_compose_name);
+
+enum led_default_state led_init_default_state_get(struct fwnode_handle *fwnode)
+{
+	const char *state = NULL;
+
+	if (!fwnode_property_read_string(fwnode, "default-state", &state)) {
+		if (!strcmp(state, "keep"))
+			return LEDS_DEFSTATE_KEEP;
+		if (!strcmp(state, "on"))
+			return LEDS_DEFSTATE_ON;
+	}
+
+	return LEDS_DEFSTATE_OFF;
+}
+EXPORT_SYMBOL_GPL(led_init_default_state_get);
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index b5d5e22d2d1e..092eb59a7d32 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -16,6 +16,7 @@
 #include <linux/platform_device.h>
 #include <linux/property.h>
 #include <linux/slab.h>
+#include "leds.h"
 
 struct gpio_led_data {
 	struct led_classdev cdev;
@@ -144,7 +145,6 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
 	device_for_each_child_node(dev, child) {
 		struct gpio_led_data *led_dat = &priv->leds[priv->num_leds];
 		struct gpio_led led = {};
-		const char *state = NULL;
 
 		/*
 		 * Acquire gpiod from DT with uninitialized label, which
@@ -161,15 +161,7 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
 
 		led_dat->gpiod = led.gpiod;
 
-		if (!fwnode_property_read_string(child, "default-state",
-						 &state)) {
-			if (!strcmp(state, "keep"))
-				led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
-			else if (!strcmp(state, "on"))
-				led.default_state = LEDS_GPIO_DEFSTATE_ON;
-			else
-				led.default_state = LEDS_GPIO_DEFSTATE_OFF;
-		}
+		led.default_state = led_init_default_state_get(child);
 
 		if (fwnode_property_present(child, "retain-state-suspended"))
 			led.retain_state_suspended = 1;
diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h
index 345062ccabda..aa64757a4d89 100644
--- a/drivers/leds/leds.h
+++ b/drivers/leds/leds.h
@@ -27,6 +27,7 @@ ssize_t led_trigger_read(struct file *filp, struct kobject *kobj,
 ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
 			struct bin_attribute *bin_attr, char *buf,
 			loff_t pos, size_t count);
+enum led_default_state led_init_default_state_get(struct fwnode_handle *fwnode);
 
 extern struct rw_semaphore leds_list_lock;
 extern struct list_head leds_list;
diff --git a/include/linux/leds.h b/include/linux/leds.h
index 329fd914cf24..a0b730be40ad 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -33,6 +33,12 @@ enum led_brightness {
 	LED_FULL	= 255,
 };
 
+enum led_default_state {
+	LEDS_DEFSTATE_OFF	= 0,
+	LEDS_DEFSTATE_ON	= 1,
+	LEDS_DEFSTATE_KEEP	= 2,
+};
+
 struct led_init_data {
 	/* device fwnode handle */
 	struct fwnode_handle *fwnode;
@@ -520,9 +526,9 @@ struct gpio_led {
 	/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
 	struct gpio_desc *gpiod;
 };
-#define LEDS_GPIO_DEFSTATE_OFF		0
-#define LEDS_GPIO_DEFSTATE_ON		1
-#define LEDS_GPIO_DEFSTATE_KEEP		2
+#define LEDS_GPIO_DEFSTATE_OFF		LEDS_DEFSTATE_OFF
+#define LEDS_GPIO_DEFSTATE_ON		LEDS_DEFSTATE_ON
+#define LEDS_GPIO_DEFSTATE_KEEP		LEDS_DEFSTATE_KEEP
 
 struct gpio_led_platform_data {
 	int 		num_leds;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v8 2/2] leds: pwm: add support for default-state device property
  2021-06-08  6:35 [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
  2021-06-08  6:35 ` [PATCH v8 1/2] leds: move default_state read from fwnode to core Denis Osterland-Heim
@ 2021-06-08  6:35 ` Denis Osterland-Heim
  2021-07-13  4:56 ` [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
  2021-08-18  6:28 ` Pavel Machek
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Osterland-Heim @ 2021-06-08  6:35 UTC (permalink / raw)
  To: Pavel Machek
  Cc: denis.osterland, linux-leds, linux-kernel, Denis Osterland-Heim

From: Denis Osterland-Heim <Denis.Osterland@diehl.com>

This patch adds support for "default-state" devicetree property, 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 sets something different.

Signed-off-by: Denis Osterland-Heim <Denis.Osterland@diehl.com>
---
 drivers/leds/leds-pwm.c | 49 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index d71e9fa5c8de..6832180c1c54 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -17,10 +17,12 @@
 #include <linux/err.h>
 #include <linux/pwm.h>
 #include <linux/slab.h>
+#include "leds.h"
 
 struct led_pwm {
 	const char	*name;
 	u8		active_low;
+	u8		default_state;
 	unsigned int	max_brightness;
 };
 
@@ -77,7 +79,38 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
 
 	led_data->cdev.brightness_set_blocking = led_pwm_set;
 
-	pwm_init_state(led_data->pwm, &led_data->pwmstate);
+	/* init PWM state */
+	switch (led->default_state) {
+	case LEDS_DEFSTATE_KEEP:
+		pwm_get_state(led_data->pwm, &led_data->pwmstate);
+		if (led_data->pwmstate.period)
+			break;
+		led->default_state = LEDS_DEFSTATE_OFF;
+		dev_warn(dev,
+			"failed to read period for %s, default to off",
+			led->name);
+		fallthrough;
+	default:
+		pwm_init_state(led_data->pwm, &led_data->pwmstate);
+		break;
+	}
+
+	/* set brightness */
+	switch (led->default_state) {
+	case LEDS_DEFSTATE_ON:
+		led_data->cdev.brightness = led->max_brightness;
+		break;
+	case LEDS_DEFSTATE_KEEP:
+		{
+		uint64_t brightness;
+
+		brightness = led->max_brightness;
+		brightness *= led_data->pwmstate.duty_cycle;
+		do_div(brightness, led_data->pwmstate.period);
+		led_data->cdev.brightness = brightness;
+		}
+		break;
+	}
 
 	ret = devm_led_classdev_register_ext(dev, &led_data->cdev, &init_data);
 	if (ret) {
@@ -86,11 +119,13 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
 		return ret;
 	}
 
-	ret = led_pwm_set(&led_data->cdev, led_data->cdev.brightness);
-	if (ret) {
-		dev_err(dev, "failed to set led PWM value for %s: %d",
-			led->name, ret);
-		return ret;
+	if (led->default_state != LEDS_DEFSTATE_KEEP) {
+		ret = led_pwm_set(&led_data->cdev, led_data->cdev.brightness);
+		if (ret) {
+			dev_err(dev, "failed to set led PWM value for %s: %d",
+				led->name, ret);
+			return ret;
+		}
 	}
 
 	priv->num_leds++;
@@ -120,6 +155,8 @@ 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.default_state = led_init_default_state_get(fwnode);
+
 		ret = led_pwm_add(dev, priv, &led, fwnode);
 		if (ret)
 			goto err_child_out;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 0/2] leds: pwm: add support for default-state device
  2021-06-08  6:35 [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
  2021-06-08  6:35 ` [PATCH v8 1/2] leds: move default_state read from fwnode to core Denis Osterland-Heim
  2021-06-08  6:35 ` [PATCH v8 2/2] leds: pwm: add support for default-state device property Denis Osterland-Heim
@ 2021-07-13  4:56 ` Denis Osterland-Heim
  2021-08-18  6:28 ` Pavel Machek
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Osterland-Heim @ 2021-07-13  4:56 UTC (permalink / raw)
  To: pavel; +Cc: linux-kernel, denis.osterland.heim, linux-leds

ping

Am Dienstag, den 08.06.2021, 08:35 +0200 schrieb Denis Osterland-Heim:
> v7 -> v8:
>  - apply and test on newest kernel
>  - drop docu patch, because it is already documented
>
> Denis Osterland-Heim (2):
>       leds: move default_state read from fwnode to core
>       leds: pwm: add support for default-state device property
>
>  drivers/leds/led-core.c  | 15 +++++++++++++++
>  drivers/leds/leds-gpio.c | 12 ++----------
>  drivers/leds/leds.h      |  1 +
>  include/linux/leds.h     | 12 +++++++++---
>  4 files changed, 27 insertions(+), 13 deletions(-)
>
> Message-Id: <20200731164945.19515-1-Denis.Osterland@diehl.com>
> base-commit: e90abb95bc71566e2016964e98181557929f55f5
>
Diehl Connectivity Solutions GmbH
Geschäftsführung: Horst Leonberger
Sitz der Gesellschaft: Nürnberg - Registergericht: Amtsgericht
Nürnberg: HRB 32315

________________________________

Der Inhalt der vorstehenden E-Mail ist nicht rechtlich bindend. Diese E-Mail enthaelt vertrauliche und/oder rechtlich geschuetzte Informationen.
Informieren Sie uns bitte, wenn Sie diese E-Mail faelschlicherweise erhalten haben. Bitte loeschen Sie in diesem Fall die Nachricht.
Jede unerlaubte Form der Reproduktion, Bekanntgabe, Aenderung, Verteilung und/oder Publikation dieser E-Mail ist strengstens untersagt.

- Informationen zum Datenschutz, insbesondere zu Ihren Rechten, erhalten Sie unter:

https://www.diehl.com/group/de/transparenz-und-informationspflichten/

The contents of the above mentioned e-mail is not legally binding. This e-mail contains confidential and/or legally protected information. Please inform us if you have received this e-mail by
mistake and delete it in such a case. Each unauthorized reproduction, disclosure, alteration, distribution and/or publication of this e-mail is strictly prohibited.

- For general information on data protection and your respective rights please visit:

https://www.diehl.com/group/en/transparency-and-information-obligations/



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 0/2] leds: pwm: add support for default-state device
  2021-06-08  6:35 [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
                   ` (2 preceding siblings ...)
  2021-07-13  4:56 ` [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
@ 2021-08-18  6:28 ` Pavel Machek
  3 siblings, 0 replies; 5+ messages in thread
From: Pavel Machek @ 2021-08-18  6:28 UTC (permalink / raw)
  To: Denis Osterland-Heim; +Cc: denis.osterland, linux-leds, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 440 bytes --]

On Tue 2021-06-08 08:35:52, Denis Osterland-Heim wrote:
> v7 -> v8:
>  - apply and test on newest kernel
>  - drop docu patch, because it is already documented
> 
> Denis Osterland-Heim (2):
>       leds: move default_state read from fwnode to core
>       leds: pwm: add support for default-state device property

Thanks, applied, sorry for the delay.

Best regards,
							Pavel
-- 
http://www.livejournal.com/~pavelmachek

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-08-18  6:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-08  6:35 [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
2021-06-08  6:35 ` [PATCH v8 1/2] leds: move default_state read from fwnode to core Denis Osterland-Heim
2021-06-08  6:35 ` [PATCH v8 2/2] leds: pwm: add support for default-state device property Denis Osterland-Heim
2021-07-13  4:56 ` [PATCH v8 0/2] leds: pwm: add support for default-state device Denis Osterland-Heim
2021-08-18  6:28 ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).