From: Andrew Lunn <andrew@lunn.ch>
To: Jacek Anaszewski <j.anaszewski@samsung.com>
Cc: linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
sakari.ailus@linux.intel.com, stsp@users.sourceforge.net,
pavel@ucw.cz, ospite@studenti.unina.it, davem@davemloft.net,
linus.walleij@linaro.org, ricardo.ribalda@gmail.com,
p.meerwald@bct-electronic.com
Subject: Re: [PATCH 1/5] leds: core: Move LED core callbacks out of led-class.c
Date: Tue, 22 Sep 2015 21:06:20 +0200 [thread overview]
Message-ID: <20150922190620.GE20029@lunn.ch> (raw)
In-Reply-To: <1442400464-27367-2-git-send-email-j.anaszewski@samsung.com>
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@samsung.com>
Acked-by: Andrew Lunn <andrew@lunn.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
>
next prev parent reply other threads:[~2015-09-22 19:06 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-16 10:47 [PATCH 0/5] LED core improvements Jacek Anaszewski
2015-09-16 10:47 ` [PATCH 1/5] leds: core: Move LED core callbacks out of led-class.c Jacek Anaszewski
2015-09-22 19:06 ` Andrew Lunn [this message]
2015-10-06 15:31 ` Pavel Machek
2015-10-07 7:29 ` Jacek Anaszewski
2015-09-16 10:47 ` [PATCH 2/5] leds: core: Add LED_BLINK_CHANGE and LED_BLINK_DISABLE flags Jacek Anaszewski
2015-09-22 18:44 ` Andrew Lunn
2015-09-23 8:07 ` Jacek Anaszewski
2015-10-06 15:35 ` Pavel Machek
2015-09-16 10:47 ` [PATCH 3/5] leds: Rename brightness_set_sync op to brightness_set_blocking Jacek Anaszewski
2015-09-22 18:54 ` Andrew Lunn
2015-09-23 8:36 ` Jacek Anaszewski
2015-09-23 9:34 ` Jacek Anaszewski
2015-10-06 15:36 ` Pavel Machek
2015-09-16 10:47 ` [PATCH 4/5] leds: core: Add an internal led_set_brightness_nosleep function Jacek Anaszewski
2015-09-22 19:02 ` Andrew Lunn
2015-09-23 8:53 ` Jacek Anaszewski
2015-09-16 10:47 ` [PATCH 5/5] leds: core: Use set_brightness_work for the blocking op Jacek Anaszewski
2015-09-22 8:03 ` Sakari Ailus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150922190620.GE20029@lunn.ch \
--to=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=j.anaszewski@samsung.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=ospite@studenti.unina.it \
--cc=p.meerwald@bct-electronic.com \
--cc=pavel@ucw.cz \
--cc=ricardo.ribalda@gmail.com \
--cc=sakari.ailus@linux.intel.com \
--cc=stsp@users.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.