Patch "platform/x86: fujitsu-laptop: use brightness_set_blocking for LED-setting callbacks" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
platform/x86: fujitsu-laptop: use brightness_set_blocking for LED-setting callbacks
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
platform-x86-fujitsu-laptop-use-brightness_set_blocking-for-led-setting-callbacks.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
a608a9d52fa4168efd478d684039ed545a69dbcdMon Sep 17 00:00:00 2001
From: Micha? K?pie? <[email protected]>
Date: Fri, 23 Dec 2016 10:00:08 +0100
Subject: platform/x86: fujitsu-laptop: use brightness_set_blocking for LED-setting callbacks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Micha? K?pie? <[email protected]>
commit a608a9d52fa4168efd478d684039ed545a69dbcd upstream.
All LED-setting functions in fujitsu-laptop are currently assigned to the brightness_set callback, which is incorrect because they can sleep (due to their use of call_fext_func(), which in turn issues ACPI calls) and the documentation (in include/linux/leds.h) clearly states they must not. Assign them to brightness_set_blocking instead and change them to match the expected function prototype.
This change makes it possible to use Fujitsu-specific LEDs with "heavy" triggers, like disk-activity or phy0rx.
--- drivers/platform/x86/fujitsu-laptop.c | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/platform/x86/fujitsu-laptop.c +21 -21
@@ -177,43 +177,43 @@ static void acpi_fujitsu_hotkey_notify(s#if IS_ENABLED (CONFIG_LEDS_CLASS )static enum led_brightness logolamp_get (struct led_classdev *cdev); -static void logolamp_set (struct led_classdev *cdev, +static int logolamp_set (struct led_classdev *cdev,enum led_brightness brightness);static struct led_classdev logolamp_led = { .name ="fujitsu::logolamp" , .brightness_get = logolamp_get, - .brightness_set = logolamp_set + .brightness_set_blocking = logolamp_set };static enum led_brightness kblamps_get (struct led_classdev *cdev); -static void kblamps_set (struct led_classdev *cdev, +static int kblamps_set (struct led_classdev *cdev,enum led_brightness brightness);static struct led_classdev kblamps_led = { .name ="fujitsu::kblamps" , .brightness_get = kblamps_get, - .brightness_set = kblamps_set + .brightness_set_blocking = kblamps_set };static enum led_brightness radio_led_get (struct led_classdev *cdev); -static void radio_led_set (struct led_classdev *cdev, +static int radio_led_set (struct led_classdev *cdev,enum led_brightness brightness);static struct led_classdev radio_led = { .name ="fujitsu::radio_led" , .brightness_get = radio_led_get, - .brightness_set = radio_led_set + .brightness_set_blocking = radio_led_set };static enum led_brightness eco_led_get (struct led_classdev *cdev); -static void eco_led_set (struct led_classdev *cdev, +static int eco_led_set (struct led_classdev *cdev,enum led_brightness brightness);static struct led_classdev eco_led = { .name ="fujitsu::eco_led" , .brightness_get = eco_led_get, - .brightness_set = eco_led_set + .brightness_set_blocking = eco_led_set };#endif
@@ -267,48 +267,48 @@ static int call_fext_func(int cmd, int a#if IS_ENABLED (CONFIG_LEDS_CLASS )/* LED class callbacks */ -static void logolamp_set (struct led_classdev *cdev, +static int logolamp_set (struct led_classdev *cdev,enum led_brightness brightness) {if (brightness >=LED_FULL ) {call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_POWERON ,FUNC_LED_ON ); -call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_ALWAYS ,FUNC_LED_ON ); +return call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_ALWAYS ,FUNC_LED_ON ); }else if (brightness >=LED_HALF ) {call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_POWERON ,FUNC_LED_ON ); -call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_ALWAYS ,FUNC_LED_OFF ); +return call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_ALWAYS ,FUNC_LED_OFF ); }else { -call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_POWERON ,FUNC_LED_OFF ); +return call_fext_func (FUNC_LEDS ,0x1 ,LOGOLAMP_POWERON ,FUNC_LED_OFF ); } } -static void kblamps_set (struct led_classdev *cdev, +static int kblamps_set (struct led_classdev *cdev,enum led_brightness brightness) {if (brightness >=LED_FULL ) -call_fext_func (FUNC_LEDS ,0x1 ,KEYBOARD_LAMPS ,FUNC_LED_ON ); +return call_fext_func (FUNC_LEDS ,0x1 ,KEYBOARD_LAMPS ,FUNC_LED_ON );else -call_fext_func (FUNC_LEDS ,0x1 ,KEYBOARD_LAMPS ,FUNC_LED_OFF ); +return call_fext_func (FUNC_LEDS ,0x1 ,KEYBOARD_LAMPS ,FUNC_LED_OFF ); } -static void radio_led_set (struct led_classdev *cdev, +static int radio_led_set (struct led_classdev *cdev,enum led_brightness brightness) {if (brightness >=LED_FULL ) -call_fext_func (FUNC_RFKILL ,0x5 ,RADIO_LED_ON ,RADIO_LED_ON ); +return call_fext_func (FUNC_RFKILL ,0x5 ,RADIO_LED_ON ,RADIO_LED_ON );else -call_fext_func (FUNC_RFKILL ,0x5 ,RADIO_LED_ON ,0x0 ); +return call_fext_func (FUNC_RFKILL ,0x5 ,RADIO_LED_ON ,0x0 ); } -static void eco_led_set (struct led_classdev *cdev, +static int eco_led_set (struct led_classdev *cdev,enum led_brightness brightness) {int curr; curr =call_fext_func (FUNC_LEDS ,0x2 ,ECO_LED ,0x0 );if (brightness >=LED_FULL ) -call_fext_func (FUNC_LEDS ,0x1 ,ECO_LED , curr |ECO_LED_ON ); +return call_fext_func (FUNC_LEDS ,0x1 ,ECO_LED , curr |ECO_LED_ON );else -call_fext_func (FUNC_LEDS ,0x1 ,ECO_LED , curr & ~ECO_LED_ON ); +return call_fext_func (FUNC_LEDS ,0x1 ,ECO_LED , curr & ~ECO_LED_ON ); }static enum led_brightness logolamp_get (struct led_classdev *cdev)
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/platform-x86-fujitsu-laptop-use-brightness_set_blocking-for-led-setting-callbacks.patch