summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wegener <sven.wegener@stealer.net>2008-08-01 23:42:47 +0000
committerSven Wegener <sven.wegener@stealer.net>2009-02-08 23:11:42 +0000
commit47118597a4729aa60825b90e56000e543e121338 (patch)
treecc2831e400e75afb6f3afde8d43ca6d88ebcfc7a
parent27421e211a39784694b597dbf35848b88363c248 (diff)
leds: Enforce unique names for triggerstmp/leds/core
We should only allow triggers with unique names. Currently further triggers registered with the same name won't be selectable via the sysfs trigger file, because we use the first one found matching the requested name. For default triggers we use the last registered trigger matching the requested name, which is inconsistent. Also we should reject the none trigger as that is a special one. Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
-rw-r--r--drivers/leds/led-triggers.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
index f910eaffe3a6..520d1afda1cc 100644
--- a/drivers/leds/led-triggers.c
+++ b/drivers/leds/led-triggers.c
@@ -143,8 +143,10 @@ void led_trigger_set_default(struct led_classdev *led_cdev)
down_read(&triggers_list_lock);
down_write(&led_cdev->trigger_lock);
list_for_each_entry(trig, &trigger_list, next_trig) {
- if (!strcmp(led_cdev->default_trigger, trig->name))
+ if (!strcmp(led_cdev->default_trigger, trig->name)) {
led_trigger_set(led_cdev, trig);
+ break;
+ }
}
up_write(&led_cdev->trigger_lock);
up_read(&triggers_list_lock);
@@ -156,12 +158,24 @@ EXPORT_SYMBOL_GPL(led_trigger_set_default);
int led_trigger_register(struct led_trigger *trigger)
{
struct led_classdev *led_cdev;
+ struct led_trigger *ltrigger;
rwlock_init(&trigger->leddev_list_lock);
INIT_LIST_HEAD(&trigger->led_cdevs);
+ /* Reject the special none trigger */
+ if (!strcmp(trigger->name, "none"))
+ return -EINVAL;
+
/* Add to the list of led triggers */
down_write(&triggers_list_lock);
+ list_for_each_entry(ltrigger, &trigger_list, next_trig) {
+ if (!strcmp(trigger->name, ltrigger->name)) {
+ up_write(&triggers_list_lock);
+
+ return -EEXIST;
+ }
+ }
list_add_tail(&trigger->next_trig, &trigger_list);
up_write(&triggers_list_lock);