Linux LED subsystem development
 help / color / mirror / Atom feed
* [PATCH v3] led/led-class: Handle LEDs with the same name
@ 2015-03-13 23:05 Ricardo Ribalda Delgado
  2015-03-25  0:54 ` Sakari Ailus
                   ` (3 more replies)
  0 siblings, 4 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-03-13 23:05 UTC (permalink / raw)
  To: Bryan Wu, Richard Purdie, linux-leds, linux-kernel
  Cc: Ricardo Ribalda Delgado

The current code expected that every LED had an unique name. This is a
legit expectation when the device tree can no be modified or extended.
But with device tree overlays this requirement can be easily broken.

This patch finds out if the name is already in use and adds the suffix
_1, _2... if not.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
v3: Suggested by Bryan Wu <cooloney@gmail.com>

-Do not allocate dynamically the name
 drivers/leds/led-class.c | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 768d33a..4ca37b8 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -212,6 +212,26 @@ static const struct dev_pm_ops leds_class_dev_pm_ops = {
 	.resume         = led_resume,
 };
 
+static int match_name(struct device *dev, const void *data)
+{
+	if (!dev_name(dev))
+		return 0;
+	return !strcmp(dev_name(dev), (char *)data);
+}
+
+static int led_classdev_next_name(const char *init_name, char *name,
+				  size_t len)
+{
+	int i = 0;
+
+	strncpy(name, init_name, len);
+
+	while (class_find_device(leds_class, NULL, name, match_name))
+		snprintf(name, len, "%s_%d", init_name, ++i);
+
+	return i;
+}
+
 /**
  * led_classdev_register - register a new object of led_classdev class.
  * @parent: The device to register.
@@ -219,12 +239,19 @@ static const struct dev_pm_ops leds_class_dev_pm_ops = {
  */
 int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
 {
+	char name[64];
+	int ret;
+
+	ret = led_classdev_next_name(led_cdev->name, name, sizeof(name));
 	led_cdev->dev = device_create_with_groups(leds_class, parent, 0,
-					led_cdev, led_cdev->groups,
-					"%s", led_cdev->name);
+					led_cdev, led_cdev->groups, name);
 	if (IS_ERR(led_cdev->dev))
 		return PTR_ERR(led_cdev->dev);
 
+	if (ret)
+		dev_info(parent, "Led %s renamed to %s due to name collision",
+				led_cdev->name, dev_name(led_cdev->dev));
+
 #ifdef CONFIG_LEDS_TRIGGERS
 	init_rwsem(&led_cdev->trigger_lock);
 #endif
-- 
2.1.4

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

end of thread, other threads:[~2015-06-26 17:47 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-13 23:05 [PATCH v3] led/led-class: Handle LEDs with the same name Ricardo Ribalda Delgado
2015-03-25  0:54 ` Sakari Ailus
2015-03-25  9:20   ` Ricardo Ribalda Delgado
2015-03-25 13:02     ` Sakari Ailus
2015-03-25 13:22       ` Ricardo Ribalda Delgado
2015-03-25 13:53         ` Sakari Ailus
2015-03-25 18:33           ` Bryan Wu
2015-03-26 23:30 ` Sakari Ailus
2015-03-27  8:09   ` Ricardo Ribalda Delgado
2015-03-27 17:24     ` Bryan Wu
2015-03-28  1:07       ` Fengguang Wu
2015-06-08 22:55         ` Kees Cook
2015-06-26  9:19           ` Geert Uytterhoeven
2015-06-26 17:47             ` Kees Cook
2015-03-30  7:59 ` Geert Uytterhoeven
2015-03-30  8:35   ` Ricardo Ribalda Delgado
2015-03-30  8:43 ` Geert Uytterhoeven

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox