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:14 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome