diff options
| author | Németh Márton <nm127@freemail.hu> | 2008-03-09 20:54:37 +0000 | 
|---|---|---|
| committer | Richard Purdie <rpurdie@rpsys.net> | 2008-04-24 23:34:18 +0100 | 
| commit | 0013b23d66a2768f5babbb0ea9f03ab067a990d8 (patch) | |
| tree | 14d60a50bb68e422767a268cd737f70ef4e6e19d /drivers | |
| parent | b3ba31f84ea041c0945b5904d4c407ce14b2b72c (diff) | |
| download | olio-linux-3.10-0013b23d66a2768f5babbb0ea9f03ab067a990d8.tar.xz olio-linux-3.10-0013b23d66a2768f5babbb0ea9f03ab067a990d8.zip  | |
leds: disable triggers on brightness set
Disable any active triggers when the brightness attribute is
set to zero.
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: Márton Németh <nm127@freemail.hu>
Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/leds/led-class.c | 3 | ||||
| -rw-r--r-- | drivers/leds/led-triggers.c | 12 | ||||
| -rw-r--r-- | drivers/leds/leds.h | 7 | ||||
| -rw-r--r-- | drivers/leds/ledtrig-timer.c | 23 | 
4 files changed, 38 insertions, 7 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index 63aad90247c..a8dd59ebedf 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c @@ -51,6 +51,9 @@ static ssize_t led_brightness_store(struct device *dev,  	if (count == size) {  		ret = count; + +		if (state == LED_OFF) +			led_trigger_remove(led_cdev);  		led_set_brightness(led_cdev, state);  	} diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index 13c9026d68a..21dd9690944 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -45,9 +45,7 @@ ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,  		trigger_name[len - 1] = '\0';  	if (!strcmp(trigger_name, "none")) { -		down_write(&led_cdev->trigger_lock); -		led_trigger_set(led_cdev, NULL); -		up_write(&led_cdev->trigger_lock); +		led_trigger_remove(led_cdev);  		return count;  	} @@ -139,6 +137,13 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger)  	led_cdev->trigger = trigger;  } +void led_trigger_remove(struct led_classdev *led_cdev) +{ +	down_write(&led_cdev->trigger_lock); +	led_trigger_set(led_cdev, NULL); +	up_write(&led_cdev->trigger_lock); +} +  void led_trigger_set_default(struct led_classdev *led_cdev)  {  	struct led_trigger *trig; @@ -231,6 +236,7 @@ void led_trigger_unregister_simple(struct led_trigger *trigger)  /* Used by LED Class */  EXPORT_SYMBOL_GPL(led_trigger_set); +EXPORT_SYMBOL_GPL(led_trigger_remove);  EXPORT_SYMBOL_GPL(led_trigger_set_default);  EXPORT_SYMBOL_GPL(led_trigger_show);  EXPORT_SYMBOL_GPL(led_trigger_store); diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h index 12b6fe93b13..0214799639f 100644 --- a/drivers/leds/leds.h +++ b/drivers/leds/leds.h @@ -27,6 +27,11 @@ static inline void led_set_brightness(struct led_classdev *led_cdev,  		led_cdev->brightness_set(led_cdev, value);  } +static inline int led_get_brightness(struct led_classdev *led_cdev) +{ +	return led_cdev->brightness; +} +  extern struct rw_semaphore leds_list_lock;  extern struct list_head leds_list; @@ -34,9 +39,11 @@ extern struct list_head leds_list;  void led_trigger_set_default(struct led_classdev *led_cdev);  void led_trigger_set(struct led_classdev *led_cdev,  			struct led_trigger *trigger); +void led_trigger_remove(struct led_classdev *led_cdev);  #else  #define led_trigger_set_default(x) do {} while(0)  #define led_trigger_set(x, y) do {} while(0) +#define led_trigger_remove(x) do {} while(0)  #endif  ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr, diff --git a/drivers/leds/ledtrig-timer.c b/drivers/leds/ledtrig-timer.c index 82c55d6e490..706297765d9 100644 --- a/drivers/leds/ledtrig-timer.c +++ b/drivers/leds/ledtrig-timer.c @@ -25,6 +25,9 @@  #include "leds.h"  struct timer_trig_data { +	int brightness_on;		/* LED brightness during "on" period. +					 * (LED_OFF < brightness_on <= LED_FULL) +					 */  	unsigned long delay_on;		/* milliseconds on */  	unsigned long delay_off;	/* milliseconds off */  	struct timer_list timer; @@ -34,17 +37,26 @@ static void led_timer_function(unsigned long data)  {  	struct led_classdev *led_cdev = (struct led_classdev *) data;  	struct timer_trig_data *timer_data = led_cdev->trigger_data; -	unsigned long brightness = LED_OFF; -	unsigned long delay = timer_data->delay_off; +	unsigned long brightness; +	unsigned long delay;  	if (!timer_data->delay_on || !timer_data->delay_off) {  		led_set_brightness(led_cdev, LED_OFF);  		return;  	} -	if (!led_cdev->brightness) { -		brightness = LED_FULL; +	brightness = led_get_brightness(led_cdev); +	if (!brightness) { +		/* Time to switch the LED on. */ +		brightness = timer_data->brightness_on;  		delay = timer_data->delay_on; +	} else { +		/* Store the current brightness value to be able +		 * to restore it when the delay_off period is over. +		 */ +		timer_data->brightness_on = brightness; +		brightness = LED_OFF; +		delay = timer_data->delay_off;  	}  	led_set_brightness(led_cdev, brightness); @@ -156,6 +168,9 @@ static void timer_trig_activate(struct led_classdev *led_cdev)  	if (!timer_data)  		return; +	timer_data->brightness_on = led_get_brightness(led_cdev); +	if (timer_data->brightness_on == LED_OFF) +		timer_data->brightness_on = LED_FULL;  	led_cdev->trigger_data = timer_data;  	init_timer(&timer_data->timer);  |