lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150922190620.GE20029@lunn.ch>
Date:	Tue, 22 Sep 2015 21:06:20 +0200
From:	Andrew Lunn <andrew@...n.ch>
To:	Jacek Anaszewski <j.anaszewski@...sung.com>
Cc:	linux-leds@...r.kernel.org, linux-kernel@...r.kernel.org,
	sakari.ailus@...ux.intel.com, stsp@...rs.sourceforge.net,
	pavel@....cz, ospite@...denti.unina.it, davem@...emloft.net,
	linus.walleij@...aro.org, ricardo.ribalda@...il.com,
	p.meerwald@...-electronic.com
Subject: Re: [PATCH 1/5] leds: core: Move LED core callbacks out of
 led-class.c

On Wed, Sep 16, 2015 at 12:47:40PM +0200, Jacek Anaszewski wrote:
> Since the API for controlling LED brightness and blinking is defined in
> the LED core, move the related timer and work callbacks to the led-core.c,
> and initialize them through a new led_core_init API.
> 
> Signed-off-by: Jacek Anaszewski <j.anaszewski@...sung.com>

Acked-by: Andrew Lunn <andrew@...n.ch>

Andrew

> ---
>  drivers/leds/led-class.c |   69 +------------------------------------------
>  drivers/leds/led-core.c  |   73 ++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/leds/leds.h      |    1 +
>  3 files changed, 75 insertions(+), 68 deletions(-)
> 
> diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
> index ca51d58..7385f98 100644
> --- a/drivers/leds/led-class.c
> +++ b/drivers/leds/led-class.c
> @@ -102,70 +102,6 @@ static const struct attribute_group *led_groups[] = {
>  	NULL,
>  };
>  
> -static void led_timer_function(unsigned long data)
> -{
> -	struct led_classdev *led_cdev = (void *)data;
> -	unsigned long brightness;
> -	unsigned long delay;
> -
> -	if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
> -		led_set_brightness_async(led_cdev, LED_OFF);
> -		return;
> -	}
> -
> -	if (led_cdev->flags & LED_BLINK_ONESHOT_STOP) {
> -		led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP;
> -		return;
> -	}
> -
> -	brightness = led_get_brightness(led_cdev);
> -	if (!brightness) {
> -		/* Time to switch the LED on. */
> -		if (led_cdev->delayed_set_value) {
> -			led_cdev->blink_brightness =
> -					led_cdev->delayed_set_value;
> -			led_cdev->delayed_set_value = 0;
> -		}
> -		brightness = led_cdev->blink_brightness;
> -		delay = led_cdev->blink_delay_on;
> -	} else {
> -		/* Store the current brightness value to be able
> -		 * to restore it when the delay_off period is over.
> -		 */
> -		led_cdev->blink_brightness = brightness;
> -		brightness = LED_OFF;
> -		delay = led_cdev->blink_delay_off;
> -	}
> -
> -	led_set_brightness_async(led_cdev, brightness);
> -
> -	/* Return in next iteration if led is in one-shot mode and we are in
> -	 * the final blink state so that the led is toggled each delay_on +
> -	 * delay_off milliseconds in worst case.
> -	 */
> -	if (led_cdev->flags & LED_BLINK_ONESHOT) {
> -		if (led_cdev->flags & LED_BLINK_INVERT) {
> -			if (brightness)
> -				led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
> -		} else {
> -			if (!brightness)
> -				led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
> -		}
> -	}
> -
> -	mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
> -}
> -
> -static void set_brightness_delayed(struct work_struct *ws)
> -{
> -	struct led_classdev *led_cdev =
> -		container_of(ws, struct led_classdev, set_brightness_work);
> -
> -	led_stop_software_blink(led_cdev);
> -
> -	led_set_brightness_async(led_cdev, led_cdev->delayed_set_value);
> -}
> -
>  /**
>   * led_classdev_suspend - suspend an led_classdev.
>   * @led_cdev: the led_classdev to suspend.
> @@ -283,10 +219,7 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
>  
>  	led_update_brightness(led_cdev);
>  
> -	INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
> -
> -	setup_timer(&led_cdev->blink_timer, led_timer_function,
> -		    (unsigned long)led_cdev);
> +	led_init_core(led_cdev);
>  
>  #ifdef CONFIG_LEDS_TRIGGERS
>  	led_trigger_set_default(led_cdev);
> diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
> index 549de7e..2cb4e37 100644
> --- a/drivers/leds/led-core.c
> +++ b/drivers/leds/led-core.c
> @@ -25,6 +25,70 @@ EXPORT_SYMBOL_GPL(leds_list_lock);
>  LIST_HEAD(leds_list);
>  EXPORT_SYMBOL_GPL(leds_list);
>  
> +static void led_timer_function(unsigned long data)
> +{
> +	struct led_classdev *led_cdev = (void *)data;
> +	unsigned long brightness;
> +	unsigned long delay;
> +
> +	if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
> +		led_set_brightness_async(led_cdev, LED_OFF);
> +		return;
> +	}
> +
> +	if (led_cdev->flags & LED_BLINK_ONESHOT_STOP) {
> +		led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP;
> +		return;
> +	}
> +
> +	brightness = led_get_brightness(led_cdev);
> +	if (!brightness) {
> +		/* Time to switch the LED on. */
> +		if (led_cdev->delayed_set_value) {
> +			led_cdev->blink_brightness =
> +					led_cdev->delayed_set_value;
> +			led_cdev->delayed_set_value = 0;
> +		}
> +		brightness = led_cdev->blink_brightness;
> +		delay = led_cdev->blink_delay_on;
> +	} else {
> +		/* Store the current brightness value to be able
> +		 * to restore it when the delay_off period is over.
> +		 */
> +		led_cdev->blink_brightness = brightness;
> +		brightness = LED_OFF;
> +		delay = led_cdev->blink_delay_off;
> +	}
> +
> +	led_set_brightness_async(led_cdev, brightness);
> +
> +	/* Return in next iteration if led is in one-shot mode and we are in
> +	 * the final blink state so that the led is toggled each delay_on +
> +	 * delay_off milliseconds in worst case.
> +	 */
> +	if (led_cdev->flags & LED_BLINK_ONESHOT) {
> +		if (led_cdev->flags & LED_BLINK_INVERT) {
> +			if (brightness)
> +				led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
> +		} else {
> +			if (!brightness)
> +				led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
> +		}
> +	}
> +
> +	mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
> +}
> +
> +static void set_brightness_delayed(struct work_struct *ws)
> +{
> +	struct led_classdev *led_cdev =
> +		container_of(ws, struct led_classdev, set_brightness_work);
> +
> +	led_stop_software_blink(led_cdev);
> +
> +	led_set_brightness_async(led_cdev, led_cdev->delayed_set_value);
> +}
> +
>  static void led_set_software_blink(struct led_classdev *led_cdev,
>  				   unsigned long delay_on,
>  				   unsigned long delay_off)
> @@ -72,6 +136,15 @@ static void led_blink_setup(struct led_classdev *led_cdev,
>  	led_set_software_blink(led_cdev, *delay_on, *delay_off);
>  }
>  
> +void led_init_core(struct led_classdev *led_cdev)
> +{
> +	INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
> +
> +	setup_timer(&led_cdev->blink_timer, led_timer_function,
> +		    (unsigned long)led_cdev);
> +}
> +EXPORT_SYMBOL(led_init_core);
> +
>  void led_blink_set(struct led_classdev *led_cdev,
>  		   unsigned long *delay_on,
>  		   unsigned long *delay_off)
> diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h
> index bc89d7a..4238fbc 100644
> --- a/drivers/leds/leds.h
> +++ b/drivers/leds/leds.h
> @@ -44,6 +44,7 @@ static inline int led_get_brightness(struct led_classdev *led_cdev)
>  	return led_cdev->brightness;
>  }
>  
> +void led_init_core(struct led_classdev *led_cdev);
>  void led_stop_software_blink(struct led_classdev *led_cdev);
>  
>  extern struct rw_semaphore leds_list_lock;
> -- 
> 1.7.9.5
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ