diff options
Diffstat (limited to 'drivers/leds/led-core.c')
| -rw-r--r-- | drivers/leds/led-core.c | 45 | 
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c index d65353d8d3f..a6f4d910ca0 100644 --- a/drivers/leds/led-core.c +++ b/drivers/leds/led-core.c @@ -27,7 +27,6 @@ EXPORT_SYMBOL_GPL(leds_list);  static void led_stop_software_blink(struct led_classdev *led_cdev)  {  	/* deactivate previous settings */ -	del_timer_sync(&led_cdev->blink_timer);  	led_cdev->blink_delay_on = 0;  	led_cdev->blink_delay_off = 0;  } @@ -61,13 +60,12 @@ static void led_set_software_blink(struct led_classdev *led_cdev,  } -void led_blink_set(struct led_classdev *led_cdev, -		   unsigned long *delay_on, -		   unsigned long *delay_off) +void led_blink_setup(struct led_classdev *led_cdev, +		     unsigned long *delay_on, +		     unsigned long *delay_off)  { -	del_timer_sync(&led_cdev->blink_timer); - -	if (led_cdev->blink_set && +	if (!(led_cdev->flags & LED_BLINK_ONESHOT) && +	    led_cdev->blink_set &&  	    !led_cdev->blink_set(led_cdev, delay_on, delay_off))  		return; @@ -77,8 +75,41 @@ void led_blink_set(struct led_classdev *led_cdev,  	led_set_software_blink(led_cdev, *delay_on, *delay_off);  } + +void led_blink_set(struct led_classdev *led_cdev, +		   unsigned long *delay_on, +		   unsigned long *delay_off) +{ +	del_timer_sync(&led_cdev->blink_timer); + +	led_cdev->flags &= ~LED_BLINK_ONESHOT; +	led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP; + +	led_blink_setup(led_cdev, delay_on, delay_off); +}  EXPORT_SYMBOL(led_blink_set); +void led_blink_set_oneshot(struct led_classdev *led_cdev, +			   unsigned long *delay_on, +			   unsigned long *delay_off, +			   int invert) +{ +	if ((led_cdev->flags & LED_BLINK_ONESHOT) && +	     timer_pending(&led_cdev->blink_timer)) +		return; + +	led_cdev->flags |= LED_BLINK_ONESHOT; +	led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP; + +	if (invert) +		led_cdev->flags |= LED_BLINK_INVERT; +	else +		led_cdev->flags &= ~LED_BLINK_INVERT; + +	led_blink_setup(led_cdev, delay_on, delay_off); +} +EXPORT_SYMBOL(led_blink_set_oneshot); +  void led_brightness_set(struct led_classdev *led_cdev,  			enum led_brightness brightness)  {  |