LED: make triggers track their state
authorGrazvydas Ignotas <notasas@gmail.com>
Tue, 24 Nov 2009 12:24:45 +0000 (14:24 +0200)
committerGrazvydas Ignotas <notasas@gmail.com>
Tue, 12 Mar 2013 21:46:01 +0000 (23:46 +0200)
Sometimes events trigger before LEDs are registered, but simple
triggers don't track their state and LED starts as if nothing
happened.

Add some state tracking to simple triggers.

drivers/leds/led-triggers.c
include/linux/leds.h

index 6f1ff93..94aeeca 100644 (file)
@@ -122,6 +122,8 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger)
                led_cdev->trigger = trigger;
                if (trigger->activate)
                        trigger->activate(led_cdev);
+               else
+                       led_set_brightness(led_cdev, trigger->prev_brightness);
        }
 }
 EXPORT_SYMBOL_GPL(led_trigger_set);
@@ -227,6 +229,7 @@ void led_trigger_event(struct led_trigger *trigger,
                led_cdev = list_entry(entry, struct led_classdev, trig_list);
                led_set_brightness(led_cdev, brightness);
        }
+       trigger->prev_brightness = brightness;
        read_unlock(&trigger->leddev_list_lock);
 }
 EXPORT_SYMBOL_GPL(led_trigger_event);
index 5884def..84102cf 100644 (file)
@@ -131,6 +131,8 @@ struct led_trigger {
 
        /* Link to next registered trigger */
        struct list_head  next_trig;
+
+       enum led_brightness prev_brightness;
 };
 
 /* Registration functions for complex triggers */