linux-leds.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] leds: tlc591xx: switch to OF and managed API
@ 2019-07-01 15:26 Jean-Jacques Hiblot
  2019-07-01 15:26 ` [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API Jean-Jacques Hiblot
  2019-07-01 15:26 ` [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function Jean-Jacques Hiblot
  0 siblings, 2 replies; 9+ messages in thread
From: Jean-Jacques Hiblot @ 2019-07-01 15:26 UTC (permalink / raw)
  To: jacek.anaszewski, pavel, dmurphy
  Cc: linux-leds, linux-kernel, tomi.valkeinen, Jean-Jacques Hiblot

This mini-series updates the tlc591xx driver to use the managed API. The
driver is also modified to pass the DT node to the LED core layer.
The goal is to be able to the generic led-backlight [0] driver on top of
it.

[0] https://lore.kernel.org/patchwork/project/lkml/list/?series=400524

Jean-Jacques Hiblot (2):
  leds: tlc591xx: simplify driver by using the managed led API
  leds: tlc591xx: Use the OF version of the LED registration function

 drivers/leds/leds-tlc591xx.c | 81 ++++++++++--------------------------
 1 file changed, 21 insertions(+), 60 deletions(-)

-- 
2.17.1

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

* [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API
  2019-07-01 15:26 [PATCH 0/2] leds: tlc591xx: switch to OF and managed API Jean-Jacques Hiblot
@ 2019-07-01 15:26 ` Jean-Jacques Hiblot
  2019-07-01 15:35   ` Dan Murphy
  2019-07-05 10:17   ` Pavel Machek
  2019-07-01 15:26 ` [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function Jean-Jacques Hiblot
  1 sibling, 2 replies; 9+ messages in thread
From: Jean-Jacques Hiblot @ 2019-07-01 15:26 UTC (permalink / raw)
  To: jacek.anaszewski, pavel, dmurphy
  Cc: linux-leds, linux-kernel, tomi.valkeinen, Jean-Jacques Hiblot

Use the managed API of the LED class (devm_led_classdev_register()
instead of led_classdev_register()).
This allows us to remove the code used to track-and-destroy the LED devices

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
 drivers/leds/leds-tlc591xx.c | 81 ++++++++++--------------------------
 1 file changed, 21 insertions(+), 60 deletions(-)

diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
index 59ff088c7d75..14e47ff44df5 100644
--- a/drivers/leds/leds-tlc591xx.c
+++ b/drivers/leds/leds-tlc591xx.c
@@ -128,51 +128,6 @@ tlc591xx_brightness_set(struct led_classdev *led_cdev,
 	return err;
 }
 
-static void
-tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
-{
-	int i = j;
-
-	while (--i >= 0) {
-		if (priv->leds[i].active)
-			led_classdev_unregister(&priv->leds[i].ldev);
-	}
-}
-
-static int
-tlc591xx_configure(struct device *dev,
-		   struct tlc591xx_priv *priv,
-		   const struct tlc591xx *tlc591xx)
-{
-	unsigned int i;
-	int err = 0;
-
-	tlc591xx_set_mode(priv->regmap, MODE2_DIM);
-	for (i = 0; i < TLC591XX_MAX_LEDS; i++) {
-		struct tlc591xx_led *led = &priv->leds[i];
-
-		if (!led->active)
-			continue;
-
-		led->priv = priv;
-		led->led_no = i;
-		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
-		led->ldev.max_brightness = LED_FULL;
-		err = led_classdev_register(dev, &led->ldev);
-		if (err < 0) {
-			dev_err(dev, "couldn't register LED %s\n",
-				led->ldev.name);
-			goto exit;
-		}
-	}
-
-	return 0;
-
-exit:
-	tlc591xx_destroy_devices(priv, i);
-	return err;
-}
-
 static const struct regmap_config tlc591xx_regmap = {
 	.reg_bits = 8,
 	.val_bits = 8,
@@ -197,7 +152,7 @@ tlc591xx_probe(struct i2c_client *client,
 	const struct of_device_id *match;
 	const struct tlc591xx *tlc591xx;
 	struct tlc591xx_priv *priv;
-	int err, count, reg;
+	int err, count, reg, idx = 0;
 
 	match = of_match_device(of_tlc591xx_leds_match, dev);
 	if (!match)
@@ -225,7 +180,11 @@ tlc591xx_probe(struct i2c_client *client,
 
 	i2c_set_clientdata(client, priv);
 
+	tlc591xx_set_mode(priv->regmap, MODE2_DIM);
+
 	for_each_child_of_node(np, child) {
+		struct tlc591xx_led *led;
+
 		err = of_property_read_u32(child, "reg", &reg);
 		if (err) {
 			of_node_put(child);
@@ -236,22 +195,25 @@ tlc591xx_probe(struct i2c_client *client,
 			of_node_put(child);
 			return -EINVAL;
 		}
-		priv->leds[reg].active = true;
-		priv->leds[reg].ldev.name =
+		led = &priv->leds[reg];
+
+		led->active = true;
+		led->ldev.name =
 			of_get_property(child, "label", NULL) ? : child->name;
-		priv->leds[reg].ldev.default_trigger =
+		led->ldev.default_trigger =
 			of_get_property(child, "linux,default-trigger", NULL);
-	}
-	return tlc591xx_configure(dev, priv, tlc591xx);
-}
-
-static int
-tlc591xx_remove(struct i2c_client *client)
-{
-	struct tlc591xx_priv *priv = i2c_get_clientdata(client);
-
-	tlc591xx_destroy_devices(priv, TLC591XX_MAX_LEDS);
 
+		led->priv = priv;
+		led->led_no = idx++;
+		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
+		led->ldev.max_brightness = LED_FULL;
+		err = devm_led_classdev_register(dev, &led->ldev);
+		if (err < 0) {
+			dev_err(dev, "couldn't register LED %s\n",
+				led->ldev.name);
+			return err;
+		}
+	}
 	return 0;
 }
 
@@ -268,7 +230,6 @@ static struct i2c_driver tlc591xx_driver = {
 		.of_match_table = of_match_ptr(of_tlc591xx_leds_match),
 	},
 	.probe = tlc591xx_probe,
-	.remove = tlc591xx_remove,
 	.id_table = tlc591xx_id,
 };
 
-- 
2.17.1

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

* [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function
  2019-07-01 15:26 [PATCH 0/2] leds: tlc591xx: switch to OF and managed API Jean-Jacques Hiblot
  2019-07-01 15:26 ` [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API Jean-Jacques Hiblot
@ 2019-07-01 15:26 ` Jean-Jacques Hiblot
  2019-07-01 15:36   ` Dan Murphy
  2019-07-05 20:24   ` Pavel Machek
  1 sibling, 2 replies; 9+ messages in thread
From: Jean-Jacques Hiblot @ 2019-07-01 15:26 UTC (permalink / raw)
  To: jacek.anaszewski, pavel, dmurphy
  Cc: linux-leds, linux-kernel, tomi.valkeinen, Jean-Jacques Hiblot

The driver parses the device-tree to identify which LED should be handled.
Since the information about the device node is known at this time, we can
provide the LED core with it. It may be useful later.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
 drivers/leds/leds-tlc591xx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
index 14e47ff44df5..6a2936c94b73 100644
--- a/drivers/leds/leds-tlc591xx.c
+++ b/drivers/leds/leds-tlc591xx.c
@@ -207,7 +207,7 @@ tlc591xx_probe(struct i2c_client *client,
 		led->led_no = idx++;
 		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
 		led->ldev.max_brightness = LED_FULL;
-		err = devm_led_classdev_register(dev, &led->ldev);
+		err = devm_of_led_classdev_register(dev, child, &led->ldev);
 		if (err < 0) {
 			dev_err(dev, "couldn't register LED %s\n",
 				led->ldev.name);
-- 
2.17.1

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

* Re: [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API
  2019-07-01 15:26 ` [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API Jean-Jacques Hiblot
@ 2019-07-01 15:35   ` Dan Murphy
  2019-07-05 10:17   ` Pavel Machek
  1 sibling, 0 replies; 9+ messages in thread
From: Dan Murphy @ 2019-07-01 15:35 UTC (permalink / raw)
  To: Jean-Jacques Hiblot, jacek.anaszewski, pavel
  Cc: linux-leds, linux-kernel, tomi.valkeinen


On 7/1/19 10:26 AM, Jean-Jacques Hiblot wrote:
> Use the managed API of the LED class (devm_led_classdev_register()
> instead of led_classdev_register()).
> This allows us to remove the code used to track-and-destroy the LED devices
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
> ---
>   drivers/leds/leds-tlc591xx.c | 81 ++++++++++--------------------------
>   1 file changed, 21 insertions(+), 60 deletions(-)
>
> diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
> index 59ff088c7d75..14e47ff44df5 100644
> --- a/drivers/leds/leds-tlc591xx.c
> +++ b/drivers/leds/leds-tlc591xx.c
> @@ -128,51 +128,6 @@ tlc591xx_brightness_set(struct led_classdev *led_cdev,
>   	return err;
>   }
>   
> -static void
> -tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
> -{
> -	int i = j;
> -
> -	while (--i >= 0) {
> -		if (priv->leds[i].active)
> -			led_classdev_unregister(&priv->leds[i].ldev);
> -	}
> -}
> -
> -static int
> -tlc591xx_configure(struct device *dev,
> -		   struct tlc591xx_priv *priv,
> -		   const struct tlc591xx *tlc591xx)
> -{
> -	unsigned int i;
> -	int err = 0;
> -
> -	tlc591xx_set_mode(priv->regmap, MODE2_DIM);
> -	for (i = 0; i < TLC591XX_MAX_LEDS; i++) {
> -		struct tlc591xx_led *led = &priv->leds[i];
> -
> -		if (!led->active)
> -			continue;
> -
> -		led->priv = priv;
> -		led->led_no = i;
> -		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
> -		led->ldev.max_brightness = LED_FULL;
> -		err = led_classdev_register(dev, &led->ldev);
> -		if (err < 0) {
> -			dev_err(dev, "couldn't register LED %s\n",
> -				led->ldev.name);
> -			goto exit;
> -		}
> -	}
> -
> -	return 0;
> -
> -exit:
> -	tlc591xx_destroy_devices(priv, i);
> -	return err;
> -}
> -
>   static const struct regmap_config tlc591xx_regmap = {
>   	.reg_bits = 8,
>   	.val_bits = 8,
> @@ -197,7 +152,7 @@ tlc591xx_probe(struct i2c_client *client,
>   	const struct of_device_id *match;
>   	const struct tlc591xx *tlc591xx;
>   	struct tlc591xx_priv *priv;
> -	int err, count, reg;
> +	int err, count, reg, idx = 0;
>   
>   	match = of_match_device(of_tlc591xx_leds_match, dev);
>   	if (!match)
> @@ -225,7 +180,11 @@ tlc591xx_probe(struct i2c_client *client,
>   
>   	i2c_set_clientdata(client, priv);
>   
> +	tlc591xx_set_mode(priv->regmap, MODE2_DIM);
> +
>   	for_each_child_of_node(np, child) {
> +		struct tlc591xx_led *led;
> +
>   		err = of_property_read_u32(child, "reg", &reg);

You should check to make sure "reg" is not out of bounds for the device.

This was handled in the for..loop in the configure routine

Dan

>   		if (err) {
>   			of_node_put(child);
> @@ -236,22 +195,25 @@ tlc591xx_probe(struct i2c_client *client,
>   			of_node_put(child);
>   			return -EINVAL;
>   		}
> -		priv->leds[reg].active = true;
> -		priv->leds[reg].ldev.name =
> +		led = &priv->leds[reg];
> +
> +		led->active = true;
> +		led->ldev.name =
>   			of_get_property(child, "label", NULL) ? : child->name;
> -		priv->leds[reg].ldev.default_trigger =
> +		led->ldev.default_trigger =
>   			of_get_property(child, "linux,default-trigger", NULL);
> -	}
> -	return tlc591xx_configure(dev, priv, tlc591xx);
> -}
> -
> -static int
> -tlc591xx_remove(struct i2c_client *client)
> -{
> -	struct tlc591xx_priv *priv = i2c_get_clientdata(client);
> -
> -	tlc591xx_destroy_devices(priv, TLC591XX_MAX_LEDS);
>   
> +		led->priv = priv;
> +		led->led_no = idx++;
> +		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
> +		led->ldev.max_brightness = LED_FULL;
> +		err = devm_led_classdev_register(dev, &led->ldev);
> +		if (err < 0) {
> +			dev_err(dev, "couldn't register LED %s\n",
> +				led->ldev.name);
> +			return err;
> +		}
> +	}
>   	return 0;
>   }
>   
> @@ -268,7 +230,6 @@ static struct i2c_driver tlc591xx_driver = {
>   		.of_match_table = of_match_ptr(of_tlc591xx_leds_match),
>   	},
>   	.probe = tlc591xx_probe,
> -	.remove = tlc591xx_remove,
>   	.id_table = tlc591xx_id,
>   };
>   

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

* Re: [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function
  2019-07-01 15:26 ` [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function Jean-Jacques Hiblot
@ 2019-07-01 15:36   ` Dan Murphy
  2019-07-05 20:24   ` Pavel Machek
  1 sibling, 0 replies; 9+ messages in thread
From: Dan Murphy @ 2019-07-01 15:36 UTC (permalink / raw)
  To: Jean-Jacques Hiblot, jacek.anaszewski, pavel
  Cc: linux-leds, linux-kernel, tomi.valkeinen

JJ

On 7/1/19 10:26 AM, Jean-Jacques Hiblot wrote:
> The driver parses the device-tree to identify which LED should be handled.
> Since the information about the device node is known at this time, we can
> provide the LED core with it. It may be useful later.
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
> ---
>   drivers/leds/leds-tlc591xx.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
> index 14e47ff44df5..6a2936c94b73 100644
> --- a/drivers/leds/leds-tlc591xx.c
> +++ b/drivers/leds/leds-tlc591xx.c
> @@ -207,7 +207,7 @@ tlc591xx_probe(struct i2c_client *client,
>   		led->led_no = idx++;
>   		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
>   		led->ldev.max_brightness = LED_FULL;
> -		err = devm_led_classdev_register(dev, &led->ldev);
> +		err = devm_of_led_classdev_register(dev, child, &led->ldev);
>   		if (err < 0) {
>   			dev_err(dev, "couldn't register LED %s\n",
>   				led->ldev.name);


Reviewed-by: Dan Murphy <dmurphy@ti.com>

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

* Re: [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API
  2019-07-01 15:26 ` [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API Jean-Jacques Hiblot
  2019-07-01 15:35   ` Dan Murphy
@ 2019-07-05 10:17   ` Pavel Machek
  2019-07-05 10:17     ` Pavel Machek
  1 sibling, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2019-07-05 10:17 UTC (permalink / raw)
  To: Jean-Jacques Hiblot
  Cc: jacek.anaszewski, dmurphy, linux-leds, linux-kernel, tomi.valkeinen

On Mon 2019-07-01 17:26:01, Jean-Jacques Hiblot wrote:
> Use the managed API of the LED class (devm_led_classdev_register()
> instead of led_classdev_register()).
> This allows us to remove the code used to track-and-destroy the LED devices
> 
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>

ack.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API
  2019-07-05 10:17   ` Pavel Machek
@ 2019-07-05 10:17     ` Pavel Machek
  0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2019-07-05 10:17 UTC (permalink / raw)
  To: Jean-Jacques Hiblot
  Cc: jacek.anaszewski, dmurphy, linux-leds, linux-kernel, tomi.valkeinen

On Mon 2019-07-01 17:26:01, Jean-Jacques Hiblot wrote:
> Use the managed API of the LED class (devm_led_classdev_register()
> instead of led_classdev_register()).
> This allows us to remove the code used to track-and-destroy the LED devices
> 
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>

ack.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function
  2019-07-01 15:26 ` [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function Jean-Jacques Hiblot
  2019-07-01 15:36   ` Dan Murphy
@ 2019-07-05 20:24   ` Pavel Machek
  2019-07-05 20:24     ` Pavel Machek
  1 sibling, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2019-07-05 20:24 UTC (permalink / raw)
  To: Jean-Jacques Hiblot
  Cc: jacek.anaszewski, dmurphy, linux-leds, linux-kernel, tomi.valkeinen

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

On Mon 2019-07-01 17:26:02, Jean-Jacques Hiblot wrote:
> The driver parses the device-tree to identify which LED should be handled.
> Since the information about the device node is known at this time, we can
> provide the LED core with it. It may be useful later.
> 
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>

Acked-by: Pavel Machek <pavel@ucw.cz>

> @@ -207,7 +207,7 @@ tlc591xx_probe(struct i2c_client *client,
>  		led->led_no = idx++;
>  		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
>  		led->ldev.max_brightness = LED_FULL;
> -		err = devm_led_classdev_register(dev, &led->ldev);
> +		err = devm_of_led_classdev_register(dev, child, &led->ldev);
>  		if (err < 0) {
>  			dev_err(dev, "couldn't register LED %s\n",
>  				led->ldev.name);

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

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

* Re: [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function
  2019-07-05 20:24   ` Pavel Machek
@ 2019-07-05 20:24     ` Pavel Machek
  0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2019-07-05 20:24 UTC (permalink / raw)
  To: Jean-Jacques Hiblot
  Cc: jacek.anaszewski, dmurphy, linux-leds, linux-kernel, tomi.valkeinen

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

On Mon 2019-07-01 17:26:02, Jean-Jacques Hiblot wrote:
> The driver parses the device-tree to identify which LED should be handled.
> Since the information about the device node is known at this time, we can
> provide the LED core with it. It may be useful later.
> 
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>

Acked-by: Pavel Machek <pavel@ucw.cz>

> @@ -207,7 +207,7 @@ tlc591xx_probe(struct i2c_client *client,
>  		led->led_no = idx++;
>  		led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
>  		led->ldev.max_brightness = LED_FULL;
> -		err = devm_led_classdev_register(dev, &led->ldev);
> +		err = devm_of_led_classdev_register(dev, child, &led->ldev);
>  		if (err < 0) {
>  			dev_err(dev, "couldn't register LED %s\n",
>  				led->ldev.name);

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

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

end of thread, other threads:[~2019-07-05 20:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-01 15:26 [PATCH 0/2] leds: tlc591xx: switch to OF and managed API Jean-Jacques Hiblot
2019-07-01 15:26 ` [PATCH 1/2] leds: tlc591xx: simplify driver by using the managed led API Jean-Jacques Hiblot
2019-07-01 15:35   ` Dan Murphy
2019-07-05 10:17   ` Pavel Machek
2019-07-05 10:17     ` Pavel Machek
2019-07-01 15:26 ` [PATCH 2/2] leds: tlc591xx: Use the OF version of the LED registration function Jean-Jacques Hiblot
2019-07-01 15:36   ` Dan Murphy
2019-07-05 20:24   ` Pavel Machek
2019-07-05 20:24     ` 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).