]> err.no Git - linux-2.6/commitdiff
leds: Add support to leds with readable status
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Tue, 18 Mar 2008 09:47:48 +0000 (09:47 +0000)
committerRichard Purdie <rpurdie@rpsys.net>
Thu, 24 Apr 2008 22:37:42 +0000 (23:37 +0100)
Some led hardware allows drivers to query the led state, and this patch
adds a hook to let the led class take advantage of that information when
available.

Without this functionality, when access to the led hardware is not
exclusive (i.e. firmware or hardware might change its state behind the
kernel's back), reality goes out of sync with the led class' idea of what
the led is doing, which is annoying at best.

Behaviour for drivers that do not or cannot read the led status is
unchanged.

Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
drivers/leds/led-class.c
include/linux/leds.h

index a8dd59ebedf844118c9b59741ae696df8cdb4870..ac05a928f7642a54a51a0627e6ca7dc904511d09 100644 (file)
 
 static struct class *leds_class;
 
+static void led_update_brightness(struct led_classdev *led_cdev)
+{
+       if (led_cdev->brightness_get)
+               led_cdev->brightness = led_cdev->brightness_get(led_cdev);
+}
+
 static ssize_t led_brightness_show(struct device *dev, 
                struct device_attribute *attr, char *buf)
 {
@@ -31,6 +37,7 @@ static ssize_t led_brightness_show(struct device *dev,
        ssize_t ret = 0;
 
        /* no lock needed for this */
+       led_update_brightness(led_cdev);
        sprintf(buf, "%u\n", led_cdev->brightness);
        ret = strlen(buf) + 1;
 
@@ -113,6 +120,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
        list_add_tail(&led_cdev->node, &leds_list);
        up_write(&leds_list_lock);
 
+       led_update_brightness(led_cdev);
+
 #ifdef CONFIG_LEDS_TRIGGERS
        init_rwsem(&led_cdev->trigger_lock);
 
index c195a674b6ca0b17a11a827a42d7788e34951879..ff1570f97045f74f24388b38a35023d165277159 100644 (file)
@@ -37,6 +37,8 @@ struct led_classdev {
        /* Set LED brightness level */
        void            (*brightness_set)(struct led_classdev *led_cdev,
                                          enum led_brightness brightness);
+       /* Get LED brightness level */
+       enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
 
        /* Activate hardware accelerated blink */
        int             (*blink_set)(struct led_classdev *led_cdev,