<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-stable.git/drivers/leds/led-core.c, branch linux-4.2.y</title>
<subtitle>Linux kernel stable tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/'/>
<entry>
<title>leds: fix brightness changing when software blinking is active</title>
<updated>2015-05-25T20:26:47+00:00</updated>
<author>
<name>Stas Sergeev</name>
<email>stsp@list.ru</email>
</author>
<published>2015-05-14T15:24:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=76931edd54f87d1e49536cd068df4783fae24d45'/>
<id>76931edd54f87d1e49536cd068df4783fae24d45</id>
<content type='text'>
The following sequence:
echo timer &gt;/sys/class/leds/&lt;name&gt;/trigger
echo 1 &gt;/sys/class/leds/&lt;name&gt;/brightness
should change the ON brightness for blinking.
The function led_set_brightness() was mistakenly initiating the
delayed blink stop procedure, which resulted in no blinking with
the timer trigger still active.

This patch fixes the problem by changing led_set_brightness()
to not initiate the delayed blink stop when brightness is not 0.

CC: Richard Purdie &lt;rpurdie@rpsys.net&gt;
CC: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
CC: linux-leds@vger.kernel.org
CC: linux-kernel@vger.kernel.org

Acked-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Signed-off-by: Stas Sergeev &lt;stsp@users.sourceforge.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The following sequence:
echo timer &gt;/sys/class/leds/&lt;name&gt;/trigger
echo 1 &gt;/sys/class/leds/&lt;name&gt;/brightness
should change the ON brightness for blinking.
The function led_set_brightness() was mistakenly initiating the
delayed blink stop procedure, which resulted in no blinking with
the timer trigger still active.

This patch fixes the problem by changing led_set_brightness()
to not initiate the delayed blink stop when brightness is not 0.

CC: Richard Purdie &lt;rpurdie@rpsys.net&gt;
CC: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
CC: linux-leds@vger.kernel.org
CC: linux-kernel@vger.kernel.org

Acked-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Signed-off-by: Stas Sergeev &lt;stsp@users.sourceforge.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: Add support for setting brightness in a synchronous way</title>
<updated>2014-11-14T22:29:35+00:00</updated>
<author>
<name>Jacek Anaszewski</name>
<email>j.anaszewski@samsung.com</email>
</author>
<published>2014-11-14T10:50:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=4d71a4a12b130ad033219e6f58c74a64059415eb'/>
<id>4d71a4a12b130ad033219e6f58c74a64059415eb</id>
<content type='text'>
There are use cases when setting a LED brightness has to
have immediate effect (e.g. setting a torch LED brightness).
This patch extends LED subsystem to support such operations.
The LED subsystem internal API __led_set_brightness is changed
to led_set_brightness_async and new led_set_brightness_sync API
is added.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
There are use cases when setting a LED brightness has to
have immediate effect (e.g. setting a torch LED brightness).
This patch extends LED subsystem to support such operations.
The LED subsystem internal API __led_set_brightness is changed
to led_set_brightness_async and new led_set_brightness_sync API
is added.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: implement sysfs interface locking mechanism</title>
<updated>2014-11-14T22:29:35+00:00</updated>
<author>
<name>Jacek Anaszewski</name>
<email>j.anaszewski@samsung.com</email>
</author>
<published>2014-09-22T15:21:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=acd899e4f3066b6662f6047da5b795cc762093cb'/>
<id>acd899e4f3066b6662f6047da5b795cc762093cb</id>
<content type='text'>
Add a mechanism for locking LED subsystem sysfs interface.
This patch prepares ground for addition of LED Flash Class
extension, whose API will be integrated with V4L2 Flash API.
Such a fusion enforces introducing a locking scheme, which
will secure consistent access to the LED Flash Class device.

The mechanism being introduced allows for disabling LED
subsystem sysfs interface by calling led_sysfs_disable function
and enabling it by calling led_sysfs_enable. The functions
alter the LED_SYSFS_DISABLE flag state and must be called
under mutex lock. The state of the lock is checked with use
of led_sysfs_is_disabled function. Such a design allows for
providing immediate feedback to the user space on whether
the LED Flash Class device is available or is under V4L2 Flash
sub-device control.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add a mechanism for locking LED subsystem sysfs interface.
This patch prepares ground for addition of LED Flash Class
extension, whose API will be integrated with V4L2 Flash API.
Such a fusion enforces introducing a locking scheme, which
will secure consistent access to the LED Flash Class device.

The mechanism being introduced allows for disabling LED
subsystem sysfs interface by calling led_sysfs_disable function
and enabling it by calling led_sysfs_enable. The functions
alter the LED_SYSFS_DISABLE flag state and must be called
under mutex lock. The state of the lock is checked with use
of led_sysfs_is_disabled function. Such a design allows for
providing immediate feedback to the user space on whether
the LED Flash Class device is available or is under V4L2 Flash
sub-device control.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: Improve and export led_update_brightness</title>
<updated>2014-09-12T21:01:54+00:00</updated>
<author>
<name>Jacek Anaszewski</name>
<email>j.anaszewski@samsung.com</email>
</author>
<published>2014-08-20T13:41:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=3ef7de5304edf60d0b8674dd7cdacc104e15a93c'/>
<id>3ef7de5304edf60d0b8674dd7cdacc104e15a93c</id>
<content type='text'>
led_update_brightness helper function used to be exploited only locally
in the led-class.c module, where its result was being passed to the
brightness_show sysfs callback. With the introduction of v4l2-flash
subdevice the same functionality becomes required for reading current
brightness from a LED device. This patch adds checking of return value
of the brightness_get callback and moves the led_update_brightness()
function to the LED subsystem public API.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
led_update_brightness helper function used to be exploited only locally
in the led-class.c module, where its result was being passed to the
brightness_show sysfs callback. With the introduction of v4l2-flash
subdevice the same functionality becomes required for reading current
brightness from a LED device. This patch adds checking of return value
of the brightness_get callback and moves the led_update_brightness()
function to the LED subsystem public API.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: Reorder include directives</title>
<updated>2014-09-11T23:55:25+00:00</updated>
<author>
<name>Jacek Anaszewski</name>
<email>j.anaszewski@samsung.com</email>
</author>
<published>2014-08-07T12:10:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=047133066e6c2549403fe5a2d619f47ba4212ef5'/>
<id>047133066e6c2549403fe5a2d619f47ba4212ef5</id>
<content type='text'>
Reorder include directives so that they are arranged
in alphabetical order.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Reorder include directives so that they are arranged
in alphabetical order.

Signed-off-by: Jacek Anaszewski &lt;j.anaszewski@samsung.com&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Richard Purdie &lt;rpurdie@rpsys.net&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Revert "leds: convert blink timer to workqueue"</title>
<updated>2014-09-02T17:02:13+00:00</updated>
<author>
<name>Jiri Kosina</name>
<email>jkosina@suse.cz</email>
</author>
<published>2014-09-02T09:03:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=9067359faf890b3a18ab38c792d458fba77b32b4'/>
<id>9067359faf890b3a18ab38c792d458fba77b32b4</id>
<content type='text'>
This reverts commit 8b37e1bef5a6b60e949e28a4db3006e4b00bd758.

It's broken as it changes led_blink_set() in a way that it can now sleep
(while synchronously waiting for workqueue to be cancelled). That's a
problem, because it's possible that this function gets called from atomic
context (tpt_trig_timer() takes a readlock and thus disables preemption).

This has been brought up 3 weeks ago already [1] but no proper fix has
materialized, and I keep seeing the problem since 3.17-rc1.

[1] https://lkml.org/lkml/2014/8/16/128

 BUG: sleeping function called from invalid context at kernel/workqueue.c:2650
 in_atomic(): 1, irqs_disabled(): 0, pid: 2335, name: wpa_supplicant
 5 locks held by wpa_supplicant/2335:
  #0:  (rtnl_mutex){+.+.+.}, at: [&lt;ffffffff814c7c92&gt;] rtnl_lock+0x12/0x20
  #1:  (&amp;wdev-&gt;mtx){+.+.+.}, at: [&lt;ffffffffc06e649c&gt;] cfg80211_mgd_wext_siwessid+0x5c/0x180 [cfg80211]
  #2:  (&amp;local-&gt;mtx){+.+.+.}, at: [&lt;ffffffffc0817dea&gt;] ieee80211_prep_connection+0x17a/0x9a0 [mac80211]
  #3:  (&amp;local-&gt;chanctx_mtx){+.+.+.}, at: [&lt;ffffffffc08081ed&gt;] ieee80211_vif_use_channel+0x5d/0x2a0 [mac80211]
  #4:  (&amp;trig-&gt;leddev_list_lock){.+.+..}, at: [&lt;ffffffffc081e68c&gt;] tpt_trig_timer+0xec/0x170 [mac80211]
 CPU: 0 PID: 2335 Comm: wpa_supplicant Not tainted 3.17.0-rc3 #1
 Hardware name: LENOVO 7470BN2/7470BN2, BIOS 6DET38WW (2.02 ) 12/19/2008
  ffff8800360b5a50 ffff8800751f76d8 ffffffff8159e97f ffff8800360b5a30
  ffff8800751f76e8 ffffffff810739a5 ffff8800751f77b0 ffffffff8106862f
  ffffffff810685d0 0aa2209200000000 ffff880000000004 ffff8800361c59d0
 Call Trace:
  [&lt;ffffffff8159e97f&gt;] dump_stack+0x4d/0x66
  [&lt;ffffffff810739a5&gt;] __might_sleep+0xe5/0x120
  [&lt;ffffffff8106862f&gt;] flush_work+0x5f/0x270
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffff810945ca&gt;] ? mark_held_locks+0x6a/0x90
  [&lt;ffffffff81068a5f&gt;] ? __cancel_work_timer+0x6f/0x100
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
  [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
  [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
  [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
  [&lt;ffffffffc081ecdd&gt;] ieee80211_mod_tpt_led_trig+0x9d/0x160 [mac80211]
  [&lt;ffffffffc07e4278&gt;] __ieee80211_recalc_idle+0x98/0x140 [mac80211]
  [&lt;ffffffffc07e59ce&gt;] ieee80211_idle_off+0xe/0x10 [mac80211]
  [&lt;ffffffffc0804e5b&gt;] ieee80211_add_chanctx+0x3b/0x220 [mac80211]
  [&lt;ffffffffc08062e4&gt;] ieee80211_new_chanctx+0x44/0xf0 [mac80211]
  [&lt;ffffffffc080838a&gt;] ieee80211_vif_use_channel+0x1fa/0x2a0 [mac80211]
  [&lt;ffffffffc0817df8&gt;] ieee80211_prep_connection+0x188/0x9a0 [mac80211]
  [&lt;ffffffffc081c246&gt;] ieee80211_mgd_auth+0x256/0x2e0 [mac80211]
  [&lt;ffffffffc07eab33&gt;] ieee80211_auth+0x13/0x20 [mac80211]
  [&lt;ffffffffc06cb006&gt;] cfg80211_mlme_auth+0x106/0x270 [cfg80211]
  [&lt;ffffffffc06ce085&gt;] cfg80211_conn_do_work+0x155/0x3b0 [cfg80211]
  [&lt;ffffffffc06cf670&gt;] cfg80211_connect+0x3f0/0x540 [cfg80211]
  [&lt;ffffffffc06e6148&gt;] cfg80211_mgd_wext_connect+0x158/0x1f0 [cfg80211]
  [&lt;ffffffffc06e651e&gt;] cfg80211_mgd_wext_siwessid+0xde/0x180 [cfg80211]
  [&lt;ffffffffc06e36c0&gt;] ? cfg80211_wext_giwessid+0x50/0x50 [cfg80211]
  [&lt;ffffffffc06e36dd&gt;] cfg80211_wext_siwessid+0x1d/0x40 [cfg80211]
  [&lt;ffffffff81584d0c&gt;] ioctl_standard_iw_point+0x14c/0x3e0
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff8158502a&gt;] ioctl_standard_call+0x8a/0xd0
  [&lt;ffffffff81584fa0&gt;] ? ioctl_standard_iw_point+0x3e0/0x3e0
  [&lt;ffffffff81584b76&gt;] wireless_process_ioctl.constprop.10+0xb6/0x100
  [&lt;ffffffff8158521d&gt;] wext_handle_ioctl+0x5d/0xb0
  [&lt;ffffffff814cfb29&gt;] dev_ioctl+0x329/0x620
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff8149c7f2&gt;] sock_ioctl+0x142/0x2e0
  [&lt;ffffffff811b0140&gt;] do_vfs_ioctl+0x300/0x520
  [&lt;ffffffff815a67fb&gt;] ? sysret_check+0x1b/0x56
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff811b03e1&gt;] SyS_ioctl+0x81/0xa0
  [&lt;ffffffff815a67d6&gt;] system_call_fastpath+0x1a/0x1f
 wlan0: send auth to 00:0b:6b:3c:8c:e4 (try 1/3)
 wlan0: authenticated
 wlan0: associate with 00:0b:6b:3c:8c:e4 (try 1/3)
 wlan0: RX AssocResp from 00:0b:6b:3c:8c:e4 (capab=0x431 status=0 aid=2)
 wlan0: associated
 IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
 cfg80211: Calling CRDA for country: NA
 wlan0: Limiting TX power to 27 (27 - 0) dBm as advertised by 00:0b:6b:3c:8c:e4

 =================================
 [ INFO: inconsistent lock state ]
 3.17.0-rc3 #1 Not tainted
 ---------------------------------
 inconsistent {SOFTIRQ-ON-W} -&gt; {IN-SOFTIRQ-W} usage.
 swapper/0/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
  ((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work)){+.?...}, at: [&lt;ffffffff810685d0&gt;] flush_work+0x0/0x270
 {SOFTIRQ-ON-W} state was registered at:
   [&lt;ffffffff81094dbe&gt;] __lock_acquire+0x30e/0x1a30
   [&lt;ffffffff81096c81&gt;] lock_acquire+0x91/0x110
   [&lt;ffffffff81068608&gt;] flush_work+0x38/0x270
   [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
   [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
   [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
   [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
   [&lt;ffffffffc081ecdd&gt;] ieee80211_mod_tpt_led_trig+0x9d/0x160 [mac80211]
   [&lt;ffffffffc07e4278&gt;] __ieee80211_recalc_idle+0x98/0x140 [mac80211]
   [&lt;ffffffffc07e59ce&gt;] ieee80211_idle_off+0xe/0x10 [mac80211]
   [&lt;ffffffffc0804e5b&gt;] ieee80211_add_chanctx+0x3b/0x220 [mac80211]
   [&lt;ffffffffc08062e4&gt;] ieee80211_new_chanctx+0x44/0xf0 [mac80211]
   [&lt;ffffffffc080838a&gt;] ieee80211_vif_use_channel+0x1fa/0x2a0 [mac80211]
   [&lt;ffffffffc0817df8&gt;] ieee80211_prep_connection+0x188/0x9a0 [mac80211]
   [&lt;ffffffffc081c246&gt;] ieee80211_mgd_auth+0x256/0x2e0 [mac80211]
   [&lt;ffffffffc07eab33&gt;] ieee80211_auth+0x13/0x20 [mac80211]
   [&lt;ffffffffc06cb006&gt;] cfg80211_mlme_auth+0x106/0x270 [cfg80211]
   [&lt;ffffffffc06ce085&gt;] cfg80211_conn_do_work+0x155/0x3b0 [cfg80211]
   [&lt;ffffffffc06cf670&gt;] cfg80211_connect+0x3f0/0x540 [cfg80211]
   [&lt;ffffffffc06e6148&gt;] cfg80211_mgd_wext_connect+0x158/0x1f0 [cfg80211]
   [&lt;ffffffffc06e651e&gt;] cfg80211_mgd_wext_siwessid+0xde/0x180 [cfg80211]
   [&lt;ffffffffc06e36dd&gt;] cfg80211_wext_siwessid+0x1d/0x40 [cfg80211]
   [&lt;ffffffff81584d0c&gt;] ioctl_standard_iw_point+0x14c/0x3e0
   [&lt;ffffffff8158502a&gt;] ioctl_standard_call+0x8a/0xd0
   [&lt;ffffffff81584b76&gt;] wireless_process_ioctl.constprop.10+0xb6/0x100
   [&lt;ffffffff8158521d&gt;] wext_handle_ioctl+0x5d/0xb0
   [&lt;ffffffff814cfb29&gt;] dev_ioctl+0x329/0x620
   [&lt;ffffffff8149c7f2&gt;] sock_ioctl+0x142/0x2e0
   [&lt;ffffffff811b0140&gt;] do_vfs_ioctl+0x300/0x520
   [&lt;ffffffff811b03e1&gt;] SyS_ioctl+0x81/0xa0
   [&lt;ffffffff815a67d6&gt;] system_call_fastpath+0x1a/0x1f
 irq event stamp: 493416
 hardirqs last  enabled at (493416): [&lt;ffffffff81068a5f&gt;] __cancel_work_timer+0x6f/0x100
 hardirqs last disabled at (493415): [&lt;ffffffff81067e9f&gt;] try_to_grab_pending+0x1f/0x160
 softirqs last  enabled at (493408): [&lt;ffffffff81053ced&gt;] _local_bh_enable+0x1d/0x50
 softirqs last disabled at (493409): [&lt;ffffffff81054c75&gt;] irq_exit+0xa5/0xb0

 other info that might help us debug this:
  Possible unsafe locking scenario:

        CPU0
        ----
   lock((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work));
   &lt;Interrupt&gt;
     lock((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work));

  *** DEADLOCK ***

 2 locks held by swapper/0/0:
  #0:  (((&amp;tpt_trig-&gt;timer))){+.-...}, at: [&lt;ffffffff810b4c50&gt;] call_timer_fn+0x0/0x180
  #1:  (&amp;trig-&gt;leddev_list_lock){.+.?..}, at: [&lt;ffffffffc081e68c&gt;] tpt_trig_timer+0xec/0x170 [mac80211]

 stack backtrace:
 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.17.0-rc3 #1
 Hardware name: LENOVO 7470BN2/7470BN2, BIOS 6DET38WW (2.02 ) 12/19/2008
  ffffffff8246eb30 ffff88007c203b00 ffffffff8159e97f ffffffff81a194c0
  ffff88007c203b50 ffffffff81599c29 0000000000000001 ffffffff00000001
  ffff880000000000 0000000000000006 ffffffff81a194c0 ffffffff81093ad0
 Call Trace:
  &lt;IRQ&gt;  [&lt;ffffffff8159e97f&gt;] dump_stack+0x4d/0x66
  [&lt;ffffffff81599c29&gt;] print_usage_bug+0x1f4/0x205
  [&lt;ffffffff81093ad0&gt;] ? check_usage_backwards+0x140/0x140
  [&lt;ffffffff810944d3&gt;] mark_lock+0x223/0x2b0
  [&lt;ffffffff81094d60&gt;] __lock_acquire+0x2b0/0x1a30
  [&lt;ffffffff81096c81&gt;] lock_acquire+0x91/0x110
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff81068608&gt;] flush_work+0x38/0x270
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffff810945ca&gt;] ? mark_held_locks+0x6a/0x90
  [&lt;ffffffff81068a5f&gt;] ? __cancel_work_timer+0x6f/0x100
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff8109469d&gt;] ? trace_hardirqs_on_caller+0xad/0x1c0
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
  [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
  [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
  [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
  [&lt;ffffffff810b4cc5&gt;] call_timer_fn+0x75/0x180
  [&lt;ffffffff810b4c50&gt;] ? process_timeout+0x10/0x10
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff810b50ac&gt;] run_timer_softirq+0x1fc/0x2f0
  [&lt;ffffffff81054805&gt;] __do_softirq+0x115/0x2e0
  [&lt;ffffffff81054c75&gt;] irq_exit+0xa5/0xb0
  [&lt;ffffffff810049b3&gt;] do_IRQ+0x53/0xf0
  [&lt;ffffffff815a74af&gt;] common_interrupt+0x6f/0x6f
  &lt;EOI&gt;  [&lt;ffffffff8147b56e&gt;] ? cpuidle_enter_state+0x6e/0x180
  [&lt;ffffffff8147b732&gt;] cpuidle_enter+0x12/0x20
  [&lt;ffffffff8108bba0&gt;] cpu_startup_entry+0x330/0x360
  [&lt;ffffffff8158fb51&gt;] rest_init+0xc1/0xd0
  [&lt;ffffffff8158fa90&gt;] ? csum_partial_copy_generic+0x170/0x170
  [&lt;ffffffff81af3ff2&gt;] start_kernel+0x44f/0x45a
  [&lt;ffffffff81af399c&gt;] ? set_init_arg+0x53/0x53
  [&lt;ffffffff81af35ad&gt;] x86_64_start_reservations+0x2a/0x2c
  [&lt;ffffffff81af36a0&gt;] x86_64_start_kernel+0xf1/0xf4

Cc: Vincent Donnefort &lt;vdonnefort@gmail.com&gt;
Cc: Hugh Dickins &lt;hughd@google.com&gt;
Cc: Tejun Heo &lt;tj@kernel.org&gt;
Signed-off-by: Jiri Kosina &lt;jkosina@suse.cz&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This reverts commit 8b37e1bef5a6b60e949e28a4db3006e4b00bd758.

It's broken as it changes led_blink_set() in a way that it can now sleep
(while synchronously waiting for workqueue to be cancelled). That's a
problem, because it's possible that this function gets called from atomic
context (tpt_trig_timer() takes a readlock and thus disables preemption).

This has been brought up 3 weeks ago already [1] but no proper fix has
materialized, and I keep seeing the problem since 3.17-rc1.

[1] https://lkml.org/lkml/2014/8/16/128

 BUG: sleeping function called from invalid context at kernel/workqueue.c:2650
 in_atomic(): 1, irqs_disabled(): 0, pid: 2335, name: wpa_supplicant
 5 locks held by wpa_supplicant/2335:
  #0:  (rtnl_mutex){+.+.+.}, at: [&lt;ffffffff814c7c92&gt;] rtnl_lock+0x12/0x20
  #1:  (&amp;wdev-&gt;mtx){+.+.+.}, at: [&lt;ffffffffc06e649c&gt;] cfg80211_mgd_wext_siwessid+0x5c/0x180 [cfg80211]
  #2:  (&amp;local-&gt;mtx){+.+.+.}, at: [&lt;ffffffffc0817dea&gt;] ieee80211_prep_connection+0x17a/0x9a0 [mac80211]
  #3:  (&amp;local-&gt;chanctx_mtx){+.+.+.}, at: [&lt;ffffffffc08081ed&gt;] ieee80211_vif_use_channel+0x5d/0x2a0 [mac80211]
  #4:  (&amp;trig-&gt;leddev_list_lock){.+.+..}, at: [&lt;ffffffffc081e68c&gt;] tpt_trig_timer+0xec/0x170 [mac80211]
 CPU: 0 PID: 2335 Comm: wpa_supplicant Not tainted 3.17.0-rc3 #1
 Hardware name: LENOVO 7470BN2/7470BN2, BIOS 6DET38WW (2.02 ) 12/19/2008
  ffff8800360b5a50 ffff8800751f76d8 ffffffff8159e97f ffff8800360b5a30
  ffff8800751f76e8 ffffffff810739a5 ffff8800751f77b0 ffffffff8106862f
  ffffffff810685d0 0aa2209200000000 ffff880000000004 ffff8800361c59d0
 Call Trace:
  [&lt;ffffffff8159e97f&gt;] dump_stack+0x4d/0x66
  [&lt;ffffffff810739a5&gt;] __might_sleep+0xe5/0x120
  [&lt;ffffffff8106862f&gt;] flush_work+0x5f/0x270
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffff810945ca&gt;] ? mark_held_locks+0x6a/0x90
  [&lt;ffffffff81068a5f&gt;] ? __cancel_work_timer+0x6f/0x100
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
  [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
  [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
  [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
  [&lt;ffffffffc081ecdd&gt;] ieee80211_mod_tpt_led_trig+0x9d/0x160 [mac80211]
  [&lt;ffffffffc07e4278&gt;] __ieee80211_recalc_idle+0x98/0x140 [mac80211]
  [&lt;ffffffffc07e59ce&gt;] ieee80211_idle_off+0xe/0x10 [mac80211]
  [&lt;ffffffffc0804e5b&gt;] ieee80211_add_chanctx+0x3b/0x220 [mac80211]
  [&lt;ffffffffc08062e4&gt;] ieee80211_new_chanctx+0x44/0xf0 [mac80211]
  [&lt;ffffffffc080838a&gt;] ieee80211_vif_use_channel+0x1fa/0x2a0 [mac80211]
  [&lt;ffffffffc0817df8&gt;] ieee80211_prep_connection+0x188/0x9a0 [mac80211]
  [&lt;ffffffffc081c246&gt;] ieee80211_mgd_auth+0x256/0x2e0 [mac80211]
  [&lt;ffffffffc07eab33&gt;] ieee80211_auth+0x13/0x20 [mac80211]
  [&lt;ffffffffc06cb006&gt;] cfg80211_mlme_auth+0x106/0x270 [cfg80211]
  [&lt;ffffffffc06ce085&gt;] cfg80211_conn_do_work+0x155/0x3b0 [cfg80211]
  [&lt;ffffffffc06cf670&gt;] cfg80211_connect+0x3f0/0x540 [cfg80211]
  [&lt;ffffffffc06e6148&gt;] cfg80211_mgd_wext_connect+0x158/0x1f0 [cfg80211]
  [&lt;ffffffffc06e651e&gt;] cfg80211_mgd_wext_siwessid+0xde/0x180 [cfg80211]
  [&lt;ffffffffc06e36c0&gt;] ? cfg80211_wext_giwessid+0x50/0x50 [cfg80211]
  [&lt;ffffffffc06e36dd&gt;] cfg80211_wext_siwessid+0x1d/0x40 [cfg80211]
  [&lt;ffffffff81584d0c&gt;] ioctl_standard_iw_point+0x14c/0x3e0
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff8158502a&gt;] ioctl_standard_call+0x8a/0xd0
  [&lt;ffffffff81584fa0&gt;] ? ioctl_standard_iw_point+0x3e0/0x3e0
  [&lt;ffffffff81584b76&gt;] wireless_process_ioctl.constprop.10+0xb6/0x100
  [&lt;ffffffff8158521d&gt;] wext_handle_ioctl+0x5d/0xb0
  [&lt;ffffffff814cfb29&gt;] dev_ioctl+0x329/0x620
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff8149c7f2&gt;] sock_ioctl+0x142/0x2e0
  [&lt;ffffffff811b0140&gt;] do_vfs_ioctl+0x300/0x520
  [&lt;ffffffff815a67fb&gt;] ? sysret_check+0x1b/0x56
  [&lt;ffffffff810946ed&gt;] ? trace_hardirqs_on_caller+0xfd/0x1c0
  [&lt;ffffffff811b03e1&gt;] SyS_ioctl+0x81/0xa0
  [&lt;ffffffff815a67d6&gt;] system_call_fastpath+0x1a/0x1f
 wlan0: send auth to 00:0b:6b:3c:8c:e4 (try 1/3)
 wlan0: authenticated
 wlan0: associate with 00:0b:6b:3c:8c:e4 (try 1/3)
 wlan0: RX AssocResp from 00:0b:6b:3c:8c:e4 (capab=0x431 status=0 aid=2)
 wlan0: associated
 IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
 cfg80211: Calling CRDA for country: NA
 wlan0: Limiting TX power to 27 (27 - 0) dBm as advertised by 00:0b:6b:3c:8c:e4

 =================================
 [ INFO: inconsistent lock state ]
 3.17.0-rc3 #1 Not tainted
 ---------------------------------
 inconsistent {SOFTIRQ-ON-W} -&gt; {IN-SOFTIRQ-W} usage.
 swapper/0/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
  ((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work)){+.?...}, at: [&lt;ffffffff810685d0&gt;] flush_work+0x0/0x270
 {SOFTIRQ-ON-W} state was registered at:
   [&lt;ffffffff81094dbe&gt;] __lock_acquire+0x30e/0x1a30
   [&lt;ffffffff81096c81&gt;] lock_acquire+0x91/0x110
   [&lt;ffffffff81068608&gt;] flush_work+0x38/0x270
   [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
   [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
   [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
   [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
   [&lt;ffffffffc081ecdd&gt;] ieee80211_mod_tpt_led_trig+0x9d/0x160 [mac80211]
   [&lt;ffffffffc07e4278&gt;] __ieee80211_recalc_idle+0x98/0x140 [mac80211]
   [&lt;ffffffffc07e59ce&gt;] ieee80211_idle_off+0xe/0x10 [mac80211]
   [&lt;ffffffffc0804e5b&gt;] ieee80211_add_chanctx+0x3b/0x220 [mac80211]
   [&lt;ffffffffc08062e4&gt;] ieee80211_new_chanctx+0x44/0xf0 [mac80211]
   [&lt;ffffffffc080838a&gt;] ieee80211_vif_use_channel+0x1fa/0x2a0 [mac80211]
   [&lt;ffffffffc0817df8&gt;] ieee80211_prep_connection+0x188/0x9a0 [mac80211]
   [&lt;ffffffffc081c246&gt;] ieee80211_mgd_auth+0x256/0x2e0 [mac80211]
   [&lt;ffffffffc07eab33&gt;] ieee80211_auth+0x13/0x20 [mac80211]
   [&lt;ffffffffc06cb006&gt;] cfg80211_mlme_auth+0x106/0x270 [cfg80211]
   [&lt;ffffffffc06ce085&gt;] cfg80211_conn_do_work+0x155/0x3b0 [cfg80211]
   [&lt;ffffffffc06cf670&gt;] cfg80211_connect+0x3f0/0x540 [cfg80211]
   [&lt;ffffffffc06e6148&gt;] cfg80211_mgd_wext_connect+0x158/0x1f0 [cfg80211]
   [&lt;ffffffffc06e651e&gt;] cfg80211_mgd_wext_siwessid+0xde/0x180 [cfg80211]
   [&lt;ffffffffc06e36dd&gt;] cfg80211_wext_siwessid+0x1d/0x40 [cfg80211]
   [&lt;ffffffff81584d0c&gt;] ioctl_standard_iw_point+0x14c/0x3e0
   [&lt;ffffffff8158502a&gt;] ioctl_standard_call+0x8a/0xd0
   [&lt;ffffffff81584b76&gt;] wireless_process_ioctl.constprop.10+0xb6/0x100
   [&lt;ffffffff8158521d&gt;] wext_handle_ioctl+0x5d/0xb0
   [&lt;ffffffff814cfb29&gt;] dev_ioctl+0x329/0x620
   [&lt;ffffffff8149c7f2&gt;] sock_ioctl+0x142/0x2e0
   [&lt;ffffffff811b0140&gt;] do_vfs_ioctl+0x300/0x520
   [&lt;ffffffff811b03e1&gt;] SyS_ioctl+0x81/0xa0
   [&lt;ffffffff815a67d6&gt;] system_call_fastpath+0x1a/0x1f
 irq event stamp: 493416
 hardirqs last  enabled at (493416): [&lt;ffffffff81068a5f&gt;] __cancel_work_timer+0x6f/0x100
 hardirqs last disabled at (493415): [&lt;ffffffff81067e9f&gt;] try_to_grab_pending+0x1f/0x160
 softirqs last  enabled at (493408): [&lt;ffffffff81053ced&gt;] _local_bh_enable+0x1d/0x50
 softirqs last disabled at (493409): [&lt;ffffffff81054c75&gt;] irq_exit+0xa5/0xb0

 other info that might help us debug this:
  Possible unsafe locking scenario:

        CPU0
        ----
   lock((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work));
   &lt;Interrupt&gt;
     lock((&amp;(&amp;led_cdev-&gt;blink_work)-&gt;work));

  *** DEADLOCK ***

 2 locks held by swapper/0/0:
  #0:  (((&amp;tpt_trig-&gt;timer))){+.-...}, at: [&lt;ffffffff810b4c50&gt;] call_timer_fn+0x0/0x180
  #1:  (&amp;trig-&gt;leddev_list_lock){.+.?..}, at: [&lt;ffffffffc081e68c&gt;] tpt_trig_timer+0xec/0x170 [mac80211]

 stack backtrace:
 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.17.0-rc3 #1
 Hardware name: LENOVO 7470BN2/7470BN2, BIOS 6DET38WW (2.02 ) 12/19/2008
  ffffffff8246eb30 ffff88007c203b00 ffffffff8159e97f ffffffff81a194c0
  ffff88007c203b50 ffffffff81599c29 0000000000000001 ffffffff00000001
  ffff880000000000 0000000000000006 ffffffff81a194c0 ffffffff81093ad0
 Call Trace:
  &lt;IRQ&gt;  [&lt;ffffffff8159e97f&gt;] dump_stack+0x4d/0x66
  [&lt;ffffffff81599c29&gt;] print_usage_bug+0x1f4/0x205
  [&lt;ffffffff81093ad0&gt;] ? check_usage_backwards+0x140/0x140
  [&lt;ffffffff810944d3&gt;] mark_lock+0x223/0x2b0
  [&lt;ffffffff81094d60&gt;] __lock_acquire+0x2b0/0x1a30
  [&lt;ffffffff81096c81&gt;] lock_acquire+0x91/0x110
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff81068608&gt;] flush_work+0x38/0x270
  [&lt;ffffffff810685d0&gt;] ? mod_delayed_work_on+0x80/0x80
  [&lt;ffffffff810945ca&gt;] ? mark_held_locks+0x6a/0x90
  [&lt;ffffffff81068a5f&gt;] ? __cancel_work_timer+0x6f/0x100
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff8109469d&gt;] ? trace_hardirqs_on_caller+0xad/0x1c0
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff81068a6b&gt;] __cancel_work_timer+0x7b/0x100
  [&lt;ffffffff81068b0e&gt;] cancel_delayed_work_sync+0xe/0x10
  [&lt;ffffffff8147cf3b&gt;] led_blink_set+0x1b/0x40
  [&lt;ffffffffc081e6b0&gt;] tpt_trig_timer+0x110/0x170 [mac80211]
  [&lt;ffffffff810b4cc5&gt;] call_timer_fn+0x75/0x180
  [&lt;ffffffff810b4c50&gt;] ? process_timeout+0x10/0x10
  [&lt;ffffffffc081e5a0&gt;] ? __ieee80211_get_rx_led_name+0x10/0x10 [mac80211]
  [&lt;ffffffff810b50ac&gt;] run_timer_softirq+0x1fc/0x2f0
  [&lt;ffffffff81054805&gt;] __do_softirq+0x115/0x2e0
  [&lt;ffffffff81054c75&gt;] irq_exit+0xa5/0xb0
  [&lt;ffffffff810049b3&gt;] do_IRQ+0x53/0xf0
  [&lt;ffffffff815a74af&gt;] common_interrupt+0x6f/0x6f
  &lt;EOI&gt;  [&lt;ffffffff8147b56e&gt;] ? cpuidle_enter_state+0x6e/0x180
  [&lt;ffffffff8147b732&gt;] cpuidle_enter+0x12/0x20
  [&lt;ffffffff8108bba0&gt;] cpu_startup_entry+0x330/0x360
  [&lt;ffffffff8158fb51&gt;] rest_init+0xc1/0xd0
  [&lt;ffffffff8158fa90&gt;] ? csum_partial_copy_generic+0x170/0x170
  [&lt;ffffffff81af3ff2&gt;] start_kernel+0x44f/0x45a
  [&lt;ffffffff81af399c&gt;] ? set_init_arg+0x53/0x53
  [&lt;ffffffff81af35ad&gt;] x86_64_start_reservations+0x2a/0x2c
  [&lt;ffffffff81af36a0&gt;] x86_64_start_kernel+0xf1/0xf4

Cc: Vincent Donnefort &lt;vdonnefort@gmail.com&gt;
Cc: Hugh Dickins &lt;hughd@google.com&gt;
Cc: Tejun Heo &lt;tj@kernel.org&gt;
Signed-off-by: Jiri Kosina &lt;jkosina@suse.cz&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: convert blink timer to workqueue</title>
<updated>2014-07-03T19:02:14+00:00</updated>
<author>
<name>Vincent Donnefort</name>
<email>vdonnefort@gmail.com</email>
</author>
<published>2014-06-14T09:21:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=8b37e1bef5a6b60e949e28a4db3006e4b00bd758'/>
<id>8b37e1bef5a6b60e949e28a4db3006e4b00bd758</id>
<content type='text'>
This patch converts the blink timer from led-core to workqueue which is more
suitable for this kind of non-priority operations. Moreover, timer may lead to
errors when a LED setting function use a scheduling function such as pinctrl
which is using mutex.

Signed-off-by: Vincent Donnefort &lt;vdonnefort@gmail.com&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This patch converts the blink timer from led-core to workqueue which is more
suitable for this kind of non-priority operations. Moreover, timer may lead to
errors when a LED setting function use a scheduling function such as pinctrl
which is using mutex.

Signed-off-by: Vincent Donnefort &lt;vdonnefort@gmail.com&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: Turn off led if blinking is disabled</title>
<updated>2014-02-27T17:56:55+00:00</updated>
<author>
<name>Stefan Sørensen</name>
<email>stefan.sorensen@spectralink.com</email>
</author>
<published>2014-02-04T08:11:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=8d82fef8bbee588d071372eb02439d2053b4bfe4'/>
<id>8d82fef8bbee588d071372eb02439d2053b4bfe4</id>
<content type='text'>
When using the timer trigger and setting delay_on to 0, the led
will stay in whatever state is was in, while intuitively one
would expect it to turn off. This patch changes the behaviour to
turn it off.

Signed-off-by: Stefan Sørensen &lt;stefan.sorensen@spectralink.com&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When using the timer trigger and setting delay_on to 0, the led
will stay in whatever state is was in, while intuitively one
would expect it to turn off. This patch changes the behaviour to
turn it off.

Signed-off-by: Stefan Sørensen &lt;stefan.sorensen@spectralink.com&gt;
Signed-off-by: Bryan Wu &lt;cooloney@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: delay led_set_brightness if stopping soft-blink</title>
<updated>2012-09-11T10:32:40+00:00</updated>
<author>
<name>Fabio Baltieri</name>
<email>fabio.baltieri@gmail.com</email>
</author>
<published>2012-08-15T13:44:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=d23a22a74fded23a12434c9463fe66cec2b0afcd'/>
<id>d23a22a74fded23a12434c9463fe66cec2b0afcd</id>
<content type='text'>
Delay execution of led_set_brightness() if need to stop soft-blink
timer.

This allows led_set_brightness to be called in hard-irq context even if
soft-blink was activated on that LED.

Signed-off-by: Fabio Baltieri &lt;fabio.baltieri@gmail.com&gt;
Cc: Pawel Moll &lt;pawel.moll@arm.com&gt;
Signed-off-by: Bryan Wu &lt;bryan.wu@canonical.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Delay execution of led_set_brightness() if need to stop soft-blink
timer.

This allows led_set_brightness to be called in hard-irq context even if
soft-blink was activated on that LED.

Signed-off-by: Fabio Baltieri &lt;fabio.baltieri@gmail.com&gt;
Cc: Pawel Moll &lt;pawel.moll@arm.com&gt;
Signed-off-by: Bryan Wu &lt;bryan.wu@canonical.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>leds: fix sparse warnings due to missing static</title>
<updated>2012-07-23T23:52:35+00:00</updated>
<author>
<name>Bryan Wu</name>
<email>bryan.wu@canonical.com</email>
</author>
<published>2012-06-15T14:15:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=20c0e6b8787c5289202f688b6be78dff4568c1df'/>
<id>20c0e6b8787c5289202f688b6be78dff4568c1df</id>
<content type='text'>
drivers/leds/led-core.c:56:6: sparse: symbol 'led_blink_setup' was not declared. Should it be static?
drivers/leds/led-triggers.c:233:6: sparse: symbol 'led_trigger_blink_setup' was not declared. Should it be static?

Reported-by: Fengguang Wu &lt;wfg@linux.intel.com&gt;
Signed-off-by: Bryan Wu &lt;bryan.wu@canonical.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
drivers/leds/led-core.c:56:6: sparse: symbol 'led_blink_setup' was not declared. Should it be static?
drivers/leds/led-triggers.c:233:6: sparse: symbol 'led_trigger_blink_setup' was not declared. Should it be static?

Reported-by: Fengguang Wu &lt;wfg@linux.intel.com&gt;
Signed-off-by: Bryan Wu &lt;bryan.wu@canonical.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
