Fix led_trigger_event() to use led_brightness_set() instead of
led_set_brightness(), so that any pending blink timer is stopped before
setting the new brightness value. Without this fix LED status may be
overridden by a pending timer.
This allows a trigger to use a mix of led_trigger_event(),
led_trigger_blink() and led_trigger_blink_oneshot() without races.
Signed-off-by: Fabio Baltieri <[email protected]>
Cc: Bryan Wu <[email protected]>
---
Hi Bryan,
I found this one while working on another patch but I think it's also needed by
other drivers which mixes led_trigger_blink() and led_trigger_event(), such as
power_supply_leds.
Without this a led don't stop blinking as it should when calling
led_trigger_event().
Should not cause any harm on other drivers.
(I'm starting to find the whole led_set_brightness/led_brightness_set thing a
bit confusing BTW...)
Fabio
drivers/leds/led-triggers.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
index fa0b9be..b88d3b9 100644
--- a/drivers/leds/led-triggers.c
+++ b/drivers/leds/led-triggers.c
@@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
struct led_classdev *led_cdev;
led_cdev = list_entry(entry, struct led_classdev, trig_list);
- led_set_brightness(led_cdev, brightness);
+ led_brightness_set(led_cdev, brightness);
}
read_unlock(&trig->leddev_list_lock);
}
--
1.7.11.rc1.9.gf623ca1.dirty
On Mon, 2012-06-11 at 22:57 +0200, Fabio Baltieri wrote:
> Fix led_trigger_event() to use led_brightness_set() instead of
> led_set_brightness(), so that any pending blink timer is stopped before
> setting the new brightness value. Without this fix LED status may be
> overridden by a pending timer.
>
> This allows a trigger to use a mix of led_trigger_event(),
> led_trigger_blink() and led_trigger_blink_oneshot() without races.
>
> Signed-off-by: Fabio Baltieri <[email protected]>
> Cc: Bryan Wu <[email protected]>
> ---
> Hi Bryan,
>
> I found this one while working on another patch but I think it's also needed by
> other drivers which mixes led_trigger_blink() and led_trigger_event(), such as
> power_supply_leds.
>
> Without this a led don't stop blinking as it should when calling
> led_trigger_event().
Good find. This is very subtle race though because both timer and
oneshot triggers call led_brightness_set() from their deactivate
routines. Is this when these events triggered using oneshot trigger?
>
> Should not cause any harm on other drivers.
>
> (I'm starting to find the whole led_set_brightness/led_brightness_set thing a
> bit confusing BTW...)
I agree with the names are confusing. :) It found it confusing as well.
Probably why we have this bug hiding until led_trigger_blink() came
along.
led_brightness_set() calls led_set_brightness(). led_set_brightness()
takes cares about whether the driver is in suspend state and invokes
driver's brightness_set interface. Maybe led_clear_blink_timer() would
be a better name for this led_brightness_set() routine.
I can volunteer to make this change if we agree that this will be a good
one to clear this naming confusion.
-- Shuah
>
> Fabio
>
> drivers/leds/led-triggers.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
> index fa0b9be..b88d3b9 100644
> --- a/drivers/leds/led-triggers.c
> +++ b/drivers/leds/led-triggers.c
> @@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
> struct led_classdev *led_cdev;
>
> led_cdev = list_entry(entry, struct led_classdev, trig_list);
> - led_set_brightness(led_cdev, brightness);
> + led_brightness_set(led_cdev, brightness);
This is in-line with led_trigger_set() which is calling
led_bightness_set() correctly. Also led_classdev_unregister() calls it I
think for the same reason so the blink timer can be stopped.
> }
> read_unlock(&trig->leddev_list_lock);
> }
On Mon, Jun 11, 2012 at 03:38:25PM -0600, Shuah Khan wrote:
> On Mon, 2012-06-11 at 22:57 +0200, Fabio Baltieri wrote:
> > Fix led_trigger_event() to use led_brightness_set() instead of
> > led_set_brightness(), so that any pending blink timer is stopped before
> > setting the new brightness value. Without this fix LED status may be
> > overridden by a pending timer.
> >
> > This allows a trigger to use a mix of led_trigger_event(),
> > led_trigger_blink() and led_trigger_blink_oneshot() without races.
> >
> > Signed-off-by: Fabio Baltieri <[email protected]>
> > Cc: Bryan Wu <[email protected]>
> > ---
> > Hi Bryan,
> >
> > I found this one while working on another patch but I think it's also needed by
> > other drivers which mixes led_trigger_blink() and led_trigger_event(), such as
> > power_supply_leds.
> >
> > Without this a led don't stop blinking as it should when calling
> > led_trigger_event().
>
> Good find. This is very subtle race though because both timer and
> oneshot triggers call led_brightness_set() from their deactivate
> routines. Is this when these events triggered using oneshot trigger?
Actually that was when mixing blink (both timer and oneshot, they use
the same timer) and standard trigger-event-set. It should be safe if
only internal (core) functions call set_brightness.
> >
> > Should not cause any harm on other drivers.
> >
> > (I'm starting to find the whole led_set_brightness/led_brightness_set thing a
> > bit confusing BTW...)
>
> I agree with the names are confusing. :) It found it confusing as well.
> Probably why we have this bug hiding until led_trigger_blink() came
> along.
>
> led_brightness_set() calls led_set_brightness(). led_set_brightness()
> takes cares about whether the driver is in suspend state and invokes
> driver's brightness_set interface. Maybe led_clear_blink_timer() would
> be a better name for this led_brightness_set() routine.
I think maybe we should just rename the function to led_set_brightness()
for the safe one (the one whichh also deactivate the time) and
_led_set_brightness() for the internal one, to put some emphasis to the
"internal" nature of the second.
> I can volunteer to make this change if we agree that this will be a good
> one to clear this naming confusion.
That would save some headache in the future! :-)
Fabio
>
> -- Shuah
>
> >
> > Fabio
> >
> > drivers/leds/led-triggers.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
> > index fa0b9be..b88d3b9 100644
> > --- a/drivers/leds/led-triggers.c
> > +++ b/drivers/leds/led-triggers.c
> > @@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
> > struct led_classdev *led_cdev;
> >
> > led_cdev = list_entry(entry, struct led_classdev, trig_list);
> > - led_set_brightness(led_cdev, brightness);
> > + led_brightness_set(led_cdev, brightness);
>
> This is in-line with led_trigger_set() which is calling
> led_bightness_set() correctly. Also led_classdev_unregister() calls it I
> think for the same reason so the blink timer can be stopped.
>
> > }
> > read_unlock(&trig->leddev_list_lock);
> > }
>
>
On Tue, Jun 12, 2012 at 3:16 PM, Fabio Baltieri
<[email protected]> wrote:
> On Mon, Jun 11, 2012 at 03:38:25PM -0600, Shuah Khan wrote:
>> On Mon, 2012-06-11 at 22:57 +0200, Fabio Baltieri wrote:
>> > Fix led_trigger_event() to use led_brightness_set() instead of
>> > led_set_brightness(), so that any pending blink timer is stopped before
>> > setting the new brightness value. ?Without this fix LED status may be
>> > overridden by a pending timer.
>> >
>> > This allows a trigger to use a mix of led_trigger_event(),
>> > led_trigger_blink() and led_trigger_blink_oneshot() without races.
>> >
>> > Signed-off-by: Fabio Baltieri <[email protected]>
>> > Cc: Bryan Wu <[email protected]>
>> > ---
>> > Hi Bryan,
>> >
>> > I found this one while working on another patch but I think it's also needed by
>> > other drivers which mixes led_trigger_blink() and led_trigger_event(), such as
>> > power_supply_leds.
>> >
>> > Without this a led don't stop blinking as it should when calling
>> > led_trigger_event().
>>
>> Good find. This is very subtle race though because both timer and
>> oneshot triggers call led_brightness_set() from their deactivate
>> routines. Is this when these events triggered using oneshot trigger?
>
> Actually that was when mixing blink (both timer and oneshot, they use
> the same timer) and standard trigger-event-set. It should be safe if
> only internal (core) functions call set_brightness.
>
>> >
>> > Should not cause any harm on other drivers.
>> >
>> > (I'm starting to find the whole led_set_brightness/led_brightness_set thing a
>> > bit confusing BTW...)
>>
>> I agree with the names are confusing. :) It found it confusing as well.
>> Probably why we have this bug hiding until led_trigger_blink() came
>> along.
>>
>> led_brightness_set() calls led_set_brightness(). led_set_brightness()
>> takes cares about whether the driver is in suspend state and invokes
>> driver's brightness_set interface. Maybe led_clear_blink_timer() would
>> be a better name for this led_brightness_set() routine.
>
> I think maybe we should just rename the function to led_set_brightness()
> for the safe one (the one whichh also deactivate the time) and
> _led_set_brightness() for the internal one, to put some emphasis to the
> "internal" nature of the second.
>
Thanks for catching this. It's a good idea we sort out those confusing name.
Probably __led_set_bringness() is more conventional than _led_set_brightness().
And might also need to revisit other function names.
>> I can volunteer to make this change if we agree that this will be a good
>> one to clear this naming confusion.
>
OK, good Shuah, please go ahead and submit patches and I will hold
this patch for a while and wait for the final fixing.
-Bryan
> That would save some headache in the future! :-)
>
> Fabio
>
>>
>> -- Shuah
>>
>> >
>> > Fabio
>> >
>> > ?drivers/leds/led-triggers.c | 2 +-
>> > ?1 file changed, 1 insertion(+), 1 deletion(-)
>> >
>> > diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
>> > index fa0b9be..b88d3b9 100644
>> > --- a/drivers/leds/led-triggers.c
>> > +++ b/drivers/leds/led-triggers.c
>> > @@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
>> > ? ? ? ? ? ? struct led_classdev *led_cdev;
>> >
>> > ? ? ? ? ? ? led_cdev = list_entry(entry, struct led_classdev, trig_list);
>> > - ? ? ? ? ? led_set_brightness(led_cdev, brightness);
>> > + ? ? ? ? ? led_brightness_set(led_cdev, brightness);
>>
>> This is in-line with led_trigger_set() which is calling
>> led_bightness_set() correctly. Also led_classdev_unregister() calls it I
>> think for the same reason so the blink timer can be stopped.
>>
>> > ? ? }
>> > ? ? read_unlock(&trig->leddev_list_lock);
>> > ?}
>>
>>
--
Bryan Wu <[email protected]>
Kernel Developer ? ?+86.186-168-78255 Mobile
Canonical Ltd. ? ? ?http://www.canonical.com
Ubuntu - Linux for human beings | http://www.ubuntu.com
>
> Thanks for catching this. It's a good idea we sort out those confusing name.
> Probably __led_set_bringness() is more conventional than _led_set_brightness().
>
> And might also need to revisit other function names.
>
> >> I can volunteer to make this change if we agree that this will be a good
> >> one to clear this naming confusion.
> >
>
> OK, good Shuah, please go ahead and submit patches and I will hold
> this patch for a while and wait for the final fixing.
>
Thanks. __led_set_brightness() sounds good. Will base patches off of
linux-leds devel unless that is not the right one.
-- Shuah
Rename leds internal interface led_set_brightness() to __led_set_brightness()
to reduce confusion between led_set_brightness() and the external interface
led_brightness_set(). led_brightness_set() cancels the timer and then calls
led_set_brightness().
Signed-off-by: Shuah Khan <[email protected]>
---
Bryan,
This is the first patch that renames led_set_brightness() to __led_set_brightness().
Will send another patch that renames led_brightness_set() to led_set_brightness().
-- Shuah
drivers/leds/led-class.c | 6 +++---
drivers/leds/led-core.c | 4 ++--
drivers/leds/led-triggers.c | 2 +-
drivers/leds/leds.h | 2 +-
drivers/leds/ledtrig-backlight.c | 8 ++++----
drivers/leds/ledtrig-default-on.c | 2 +-
drivers/leds/ledtrig-gpio.c | 6 +++---
drivers/leds/ledtrig-heartbeat.c | 2 +-
drivers/leds/ledtrig-oneshot.c | 4 ++--
drivers/leds/ledtrig-transient.c | 8 ++++----
10 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 81eb091..cb0a6eb 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -53,7 +53,7 @@ static ssize_t led_brightness_store(struct device *dev,
if (state == LED_OFF)
led_trigger_remove(led_cdev);
- led_set_brightness(led_cdev, state);
+ __led_set_brightness(led_cdev, state);
return size;
}
@@ -82,7 +82,7 @@ static void led_timer_function(unsigned long data)
unsigned long delay;
if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
- led_set_brightness(led_cdev, LED_OFF);
+ __led_set_brightness(led_cdev, LED_OFF);
return;
}
@@ -105,7 +105,7 @@ static void led_timer_function(unsigned long data)
delay = led_cdev->blink_delay_off;
}
- led_set_brightness(led_cdev, brightness);
+ __led_set_brightness(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 +
diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
index 31f1f78..176961b 100644
--- a/drivers/leds/led-core.c
+++ b/drivers/leds/led-core.c
@@ -45,7 +45,7 @@ static void led_set_software_blink(struct led_classdev *led_cdev,
/* never off - just set to brightness */
if (!delay_off) {
- led_set_brightness(led_cdev, led_cdev->blink_brightness);
+ __led_set_brightness(led_cdev, led_cdev->blink_brightness);
return;
}
@@ -111,6 +111,6 @@ void led_brightness_set(struct led_classdev *led_cdev,
led_cdev->blink_delay_on = 0;
led_cdev->blink_delay_off = 0;
- led_set_brightness(led_cdev, brightness);
+ __led_set_brightness(led_cdev, brightness);
}
EXPORT_SYMBOL(led_brightness_set);
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
index fa0b9be..f8b14dd 100644
--- a/drivers/leds/led-triggers.c
+++ b/drivers/leds/led-triggers.c
@@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
struct led_classdev *led_cdev;
led_cdev = list_entry(entry, struct led_classdev, trig_list);
- led_set_brightness(led_cdev, brightness);
+ __led_set_brightness(led_cdev, brightness);
}
read_unlock(&trig->leddev_list_lock);
}
diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h
index e77c7f8..d02acd4 100644
--- a/drivers/leds/leds.h
+++ b/drivers/leds/leds.h
@@ -17,7 +17,7 @@
#include <linux/rwsem.h>
#include <linux/leds.h>
-static inline void led_set_brightness(struct led_classdev *led_cdev,
+static inline void __led_set_brightness(struct led_classdev *led_cdev,
enum led_brightness value)
{
if (value > led_cdev->max_brightness)
diff --git a/drivers/leds/ledtrig-backlight.c b/drivers/leds/ledtrig-backlight.c
index e272686..b941685 100644
--- a/drivers/leds/ledtrig-backlight.c
+++ b/drivers/leds/ledtrig-backlight.c
@@ -46,9 +46,9 @@ static int fb_notifier_callback(struct notifier_block *p,
if ((n->old_status == UNBLANK) ^ n->invert) {
n->brightness = led->brightness;
- led_set_brightness(led, LED_OFF);
+ __led_set_brightness(led, LED_OFF);
} else {
- led_set_brightness(led, n->brightness);
+ __led_set_brightness(led, n->brightness);
}
n->old_status = new_status;
@@ -87,9 +87,9 @@ static ssize_t bl_trig_invert_store(struct device *dev,
/* After inverting, we need to update the LED. */
if ((n->old_status == BLANK) ^ n->invert)
- led_set_brightness(led, LED_OFF);
+ __led_set_brightness(led, LED_OFF);
else
- led_set_brightness(led, n->brightness);
+ __led_set_brightness(led, n->brightness);
return num;
}
diff --git a/drivers/leds/ledtrig-default-on.c b/drivers/leds/ledtrig-default-on.c
index a4ef54b..eac1f1b 100644
--- a/drivers/leds/ledtrig-default-on.c
+++ b/drivers/leds/ledtrig-default-on.c
@@ -19,7 +19,7 @@
static void defon_trig_activate(struct led_classdev *led_cdev)
{
- led_set_brightness(led_cdev, led_cdev->max_brightness);
+ __led_set_brightness(led_cdev, led_cdev->max_brightness);
}
static struct led_trigger defon_led_trigger = {
diff --git a/drivers/leds/ledtrig-gpio.c b/drivers/leds/ledtrig-gpio.c
index f057c10..ba215dc 100644
--- a/drivers/leds/ledtrig-gpio.c
+++ b/drivers/leds/ledtrig-gpio.c
@@ -54,12 +54,12 @@ static void gpio_trig_work(struct work_struct *work)
if (tmp) {
if (gpio_data->desired_brightness)
- led_set_brightness(gpio_data->led,
+ __led_set_brightness(gpio_data->led,
gpio_data->desired_brightness);
else
- led_set_brightness(gpio_data->led, LED_FULL);
+ __led_set_brightness(gpio_data->led, LED_FULL);
} else {
- led_set_brightness(gpio_data->led, LED_OFF);
+ __led_set_brightness(gpio_data->led, LED_OFF);
}
}
diff --git a/drivers/leds/ledtrig-heartbeat.c b/drivers/leds/ledtrig-heartbeat.c
index 41dc76d..d3039f2 100644
--- a/drivers/leds/ledtrig-heartbeat.c
+++ b/drivers/leds/ledtrig-heartbeat.c
@@ -67,7 +67,7 @@ static void led_heartbeat_function(unsigned long data)
break;
}
- led_set_brightness(led_cdev, brightness);
+ __led_set_brightness(led_cdev, brightness);
mod_timer(&heartbeat_data->timer, jiffies + delay);
}
diff --git a/drivers/leds/ledtrig-oneshot.c b/drivers/leds/ledtrig-oneshot.c
index 5c9edf7..5cbab41 100644
--- a/drivers/leds/ledtrig-oneshot.c
+++ b/drivers/leds/ledtrig-oneshot.c
@@ -63,9 +63,9 @@ static ssize_t led_invert_store(struct device *dev,
oneshot_data->invert = !!state;
if (oneshot_data->invert)
- led_set_brightness(led_cdev, LED_FULL);
+ __led_set_brightness(led_cdev, LED_FULL);
else
- led_set_brightness(led_cdev, LED_OFF);
+ __led_set_brightness(led_cdev, LED_OFF);
return size;
}
diff --git a/drivers/leds/ledtrig-transient.c b/drivers/leds/ledtrig-transient.c
index 83179f4..398f104 100644
--- a/drivers/leds/ledtrig-transient.c
+++ b/drivers/leds/ledtrig-transient.c
@@ -41,7 +41,7 @@ static void transient_timer_function(unsigned long data)
struct transient_trig_data *transient_data = led_cdev->trigger_data;
transient_data->activate = 0;
- led_set_brightness(led_cdev, transient_data->restore_state);
+ __led_set_brightness(led_cdev, transient_data->restore_state);
}
static ssize_t transient_activate_show(struct device *dev,
@@ -72,7 +72,7 @@ static ssize_t transient_activate_store(struct device *dev,
if (state == 0 && transient_data->activate == 1) {
del_timer(&transient_data->timer);
transient_data->activate = state;
- led_set_brightness(led_cdev, transient_data->restore_state);
+ __led_set_brightness(led_cdev, transient_data->restore_state);
return size;
}
@@ -80,7 +80,7 @@ static ssize_t transient_activate_store(struct device *dev,
if (state == 1 && transient_data->activate == 0 &&
transient_data->duration != 0) {
transient_data->activate = state;
- led_set_brightness(led_cdev, transient_data->state);
+ __led_set_brightness(led_cdev, transient_data->state);
transient_data->restore_state =
(transient_data->state == LED_FULL) ? LED_OFF : LED_FULL;
mod_timer(&transient_data->timer,
@@ -203,7 +203,7 @@ static void transient_trig_deactivate(struct led_classdev *led_cdev)
if (led_cdev->activated) {
del_timer_sync(&transient_data->timer);
- led_set_brightness(led_cdev, transient_data->restore_state);
+ __led_set_brightness(led_cdev, transient_data->restore_state);
device_remove_file(led_cdev->dev, &dev_attr_activate);
device_remove_file(led_cdev->dev, &dev_attr_duration);
device_remove_file(led_cdev->dev, &dev_attr_state);
--
1.7.9.5
On Wed, Jun 13, 2012 at 10:01 AM, Shuah Khan <[email protected]> wrote:
> Rename leds internal interface led_set_brightness() to __led_set_brightness()
> to reduce confusion between led_set_brightness() and the external interface
> led_brightness_set(). led_brightness_set() cancels the timer and then calls
> led_set_brightness().
>
>
> Signed-off-by: Shuah Khan <[email protected]>
> ---
>
> Bryan,
>
> This is the first patch that renames led_set_brightness() to __led_set_brightness().
> Will send another patch that renames led_brightness_set() to led_set_brightness().
>
> -- Shuah
OK, thanks, applied to devel and for-next
>
>
> ?drivers/leds/led-class.c ? ? ? ? ?| ? ?6 +++---
> ?drivers/leds/led-core.c ? ? ? ? ? | ? ?4 ++--
> ?drivers/leds/led-triggers.c ? ? ? | ? ?2 +-
> ?drivers/leds/leds.h ? ? ? ? ? ? ? | ? ?2 +-
> ?drivers/leds/ledtrig-backlight.c ?| ? ?8 ++++----
> ?drivers/leds/ledtrig-default-on.c | ? ?2 +-
> ?drivers/leds/ledtrig-gpio.c ? ? ? | ? ?6 +++---
> ?drivers/leds/ledtrig-heartbeat.c ?| ? ?2 +-
> ?drivers/leds/ledtrig-oneshot.c ? ?| ? ?4 ++--
> ?drivers/leds/ledtrig-transient.c ?| ? ?8 ++++----
> ?10 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
> index 81eb091..cb0a6eb 100644
> --- a/drivers/leds/led-class.c
> +++ b/drivers/leds/led-class.c
> @@ -53,7 +53,7 @@ static ssize_t led_brightness_store(struct device *dev,
>
> ? ? ? ?if (state == LED_OFF)
> ? ? ? ? ? ? ? ?led_trigger_remove(led_cdev);
> - ? ? ? led_set_brightness(led_cdev, state);
> + ? ? ? __led_set_brightness(led_cdev, state);
>
> ? ? ? ?return size;
> ?}
> @@ -82,7 +82,7 @@ static void led_timer_function(unsigned long data)
> ? ? ? ?unsigned long delay;
>
> ? ? ? ?if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, LED_OFF);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, LED_OFF);
> ? ? ? ? ? ? ? ?return;
> ? ? ? ?}
>
> @@ -105,7 +105,7 @@ static void led_timer_function(unsigned long data)
> ? ? ? ? ? ? ? ?delay = led_cdev->blink_delay_off;
> ? ? ? ?}
>
> - ? ? ? led_set_brightness(led_cdev, brightness);
> + ? ? ? __led_set_brightness(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 +
> diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
> index 31f1f78..176961b 100644
> --- a/drivers/leds/led-core.c
> +++ b/drivers/leds/led-core.c
> @@ -45,7 +45,7 @@ static void led_set_software_blink(struct led_classdev *led_cdev,
>
> ? ? ? ?/* never off - just set to brightness */
> ? ? ? ?if (!delay_off) {
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, led_cdev->blink_brightness);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, led_cdev->blink_brightness);
> ? ? ? ? ? ? ? ?return;
> ? ? ? ?}
>
> @@ -111,6 +111,6 @@ void led_brightness_set(struct led_classdev *led_cdev,
> ? ? ? ?led_cdev->blink_delay_on = 0;
> ? ? ? ?led_cdev->blink_delay_off = 0;
>
> - ? ? ? led_set_brightness(led_cdev, brightness);
> + ? ? ? __led_set_brightness(led_cdev, brightness);
> ?}
> ?EXPORT_SYMBOL(led_brightness_set);
> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
> index fa0b9be..f8b14dd 100644
> --- a/drivers/leds/led-triggers.c
> +++ b/drivers/leds/led-triggers.c
> @@ -224,7 +224,7 @@ void led_trigger_event(struct led_trigger *trig,
> ? ? ? ? ? ? ? ?struct led_classdev *led_cdev;
>
> ? ? ? ? ? ? ? ?led_cdev = list_entry(entry, struct led_classdev, trig_list);
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, brightness);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, brightness);
> ? ? ? ?}
> ? ? ? ?read_unlock(&trig->leddev_list_lock);
> ?}
> diff --git a/drivers/leds/leds.h b/drivers/leds/leds.h
> index e77c7f8..d02acd4 100644
> --- a/drivers/leds/leds.h
> +++ b/drivers/leds/leds.h
> @@ -17,7 +17,7 @@
> ?#include <linux/rwsem.h>
> ?#include <linux/leds.h>
>
> -static inline void led_set_brightness(struct led_classdev *led_cdev,
> +static inline void __led_set_brightness(struct led_classdev *led_cdev,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?enum led_brightness value)
> ?{
> ? ? ? ?if (value > led_cdev->max_brightness)
> diff --git a/drivers/leds/ledtrig-backlight.c b/drivers/leds/ledtrig-backlight.c
> index e272686..b941685 100644
> --- a/drivers/leds/ledtrig-backlight.c
> +++ b/drivers/leds/ledtrig-backlight.c
> @@ -46,9 +46,9 @@ static int fb_notifier_callback(struct notifier_block *p,
>
> ? ? ? ? ? ? ? ?if ((n->old_status == UNBLANK) ^ n->invert) {
> ? ? ? ? ? ? ? ? ? ? ? ?n->brightness = led->brightness;
> - ? ? ? ? ? ? ? ? ? ? ? led_set_brightness(led, LED_OFF);
> + ? ? ? ? ? ? ? ? ? ? ? __led_set_brightness(led, LED_OFF);
> ? ? ? ? ? ? ? ?} else {
> - ? ? ? ? ? ? ? ? ? ? ? led_set_brightness(led, n->brightness);
> + ? ? ? ? ? ? ? ? ? ? ? __led_set_brightness(led, n->brightness);
> ? ? ? ? ? ? ? ?}
>
> ? ? ? ? ? ? ? ?n->old_status = new_status;
> @@ -87,9 +87,9 @@ static ssize_t bl_trig_invert_store(struct device *dev,
>
> ? ? ? ?/* After inverting, we need to update the LED. */
> ? ? ? ?if ((n->old_status == BLANK) ^ n->invert)
> - ? ? ? ? ? ? ? led_set_brightness(led, LED_OFF);
> + ? ? ? ? ? ? ? __led_set_brightness(led, LED_OFF);
> ? ? ? ?else
> - ? ? ? ? ? ? ? led_set_brightness(led, n->brightness);
> + ? ? ? ? ? ? ? __led_set_brightness(led, n->brightness);
>
> ? ? ? ?return num;
> ?}
> diff --git a/drivers/leds/ledtrig-default-on.c b/drivers/leds/ledtrig-default-on.c
> index a4ef54b..eac1f1b 100644
> --- a/drivers/leds/ledtrig-default-on.c
> +++ b/drivers/leds/ledtrig-default-on.c
> @@ -19,7 +19,7 @@
>
> ?static void defon_trig_activate(struct led_classdev *led_cdev)
> ?{
> - ? ? ? led_set_brightness(led_cdev, led_cdev->max_brightness);
> + ? ? ? __led_set_brightness(led_cdev, led_cdev->max_brightness);
> ?}
>
> ?static struct led_trigger defon_led_trigger = {
> diff --git a/drivers/leds/ledtrig-gpio.c b/drivers/leds/ledtrig-gpio.c
> index f057c10..ba215dc 100644
> --- a/drivers/leds/ledtrig-gpio.c
> +++ b/drivers/leds/ledtrig-gpio.c
> @@ -54,12 +54,12 @@ static void gpio_trig_work(struct work_struct *work)
>
> ? ? ? ?if (tmp) {
> ? ? ? ? ? ? ? ?if (gpio_data->desired_brightness)
> - ? ? ? ? ? ? ? ? ? ? ? led_set_brightness(gpio_data->led,
> + ? ? ? ? ? ? ? ? ? ? ? __led_set_brightness(gpio_data->led,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gpio_data->desired_brightness);
> ? ? ? ? ? ? ? ?else
> - ? ? ? ? ? ? ? ? ? ? ? led_set_brightness(gpio_data->led, LED_FULL);
> + ? ? ? ? ? ? ? ? ? ? ? __led_set_brightness(gpio_data->led, LED_FULL);
> ? ? ? ?} else {
> - ? ? ? ? ? ? ? led_set_brightness(gpio_data->led, LED_OFF);
> + ? ? ? ? ? ? ? __led_set_brightness(gpio_data->led, LED_OFF);
> ? ? ? ?}
> ?}
>
> diff --git a/drivers/leds/ledtrig-heartbeat.c b/drivers/leds/ledtrig-heartbeat.c
> index 41dc76d..d3039f2 100644
> --- a/drivers/leds/ledtrig-heartbeat.c
> +++ b/drivers/leds/ledtrig-heartbeat.c
> @@ -67,7 +67,7 @@ static void led_heartbeat_function(unsigned long data)
> ? ? ? ? ? ? ? ?break;
> ? ? ? ?}
>
> - ? ? ? led_set_brightness(led_cdev, brightness);
> + ? ? ? __led_set_brightness(led_cdev, brightness);
> ? ? ? ?mod_timer(&heartbeat_data->timer, jiffies + delay);
> ?}
>
> diff --git a/drivers/leds/ledtrig-oneshot.c b/drivers/leds/ledtrig-oneshot.c
> index 5c9edf7..5cbab41 100644
> --- a/drivers/leds/ledtrig-oneshot.c
> +++ b/drivers/leds/ledtrig-oneshot.c
> @@ -63,9 +63,9 @@ static ssize_t led_invert_store(struct device *dev,
> ? ? ? ?oneshot_data->invert = !!state;
>
> ? ? ? ?if (oneshot_data->invert)
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, LED_FULL);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, LED_FULL);
> ? ? ? ?else
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, LED_OFF);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, LED_OFF);
>
> ? ? ? ?return size;
> ?}
> diff --git a/drivers/leds/ledtrig-transient.c b/drivers/leds/ledtrig-transient.c
> index 83179f4..398f104 100644
> --- a/drivers/leds/ledtrig-transient.c
> +++ b/drivers/leds/ledtrig-transient.c
> @@ -41,7 +41,7 @@ static void transient_timer_function(unsigned long data)
> ? ? ? ?struct transient_trig_data *transient_data = led_cdev->trigger_data;
>
> ? ? ? ?transient_data->activate = 0;
> - ? ? ? led_set_brightness(led_cdev, transient_data->restore_state);
> + ? ? ? __led_set_brightness(led_cdev, transient_data->restore_state);
> ?}
>
> ?static ssize_t transient_activate_show(struct device *dev,
> @@ -72,7 +72,7 @@ static ssize_t transient_activate_store(struct device *dev,
> ? ? ? ?if (state == 0 && transient_data->activate == 1) {
> ? ? ? ? ? ? ? ?del_timer(&transient_data->timer);
> ? ? ? ? ? ? ? ?transient_data->activate = state;
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, transient_data->restore_state);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, transient_data->restore_state);
> ? ? ? ? ? ? ? ?return size;
> ? ? ? ?}
>
> @@ -80,7 +80,7 @@ static ssize_t transient_activate_store(struct device *dev,
> ? ? ? ?if (state == 1 && transient_data->activate == 0 &&
> ? ? ? ? ? ?transient_data->duration != 0) {
> ? ? ? ? ? ? ? ?transient_data->activate = state;
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, transient_data->state);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, transient_data->state);
> ? ? ? ? ? ? ? ?transient_data->restore_state =
> ? ? ? ? ? ? ? ? ? ?(transient_data->state == LED_FULL) ? LED_OFF : LED_FULL;
> ? ? ? ? ? ? ? ?mod_timer(&transient_data->timer,
> @@ -203,7 +203,7 @@ static void transient_trig_deactivate(struct led_classdev *led_cdev)
>
> ? ? ? ?if (led_cdev->activated) {
> ? ? ? ? ? ? ? ?del_timer_sync(&transient_data->timer);
> - ? ? ? ? ? ? ? led_set_brightness(led_cdev, transient_data->restore_state);
> + ? ? ? ? ? ? ? __led_set_brightness(led_cdev, transient_data->restore_state);
> ? ? ? ? ? ? ? ?device_remove_file(led_cdev->dev, &dev_attr_activate);
> ? ? ? ? ? ? ? ?device_remove_file(led_cdev->dev, &dev_attr_duration);
> ? ? ? ? ? ? ? ?device_remove_file(led_cdev->dev, &dev_attr_state);
> --
> 1.7.9.5
>
>
>
--
Bryan Wu <[email protected]>
Kernel Developer ? ?+86.186-168-78255 Mobile
Canonical Ltd. ? ? ?http://www.canonical.com
Ubuntu - Linux for human beings | http://www.ubuntu.com