Skip to content

Commit ccb61a3

Browse files
elenrilij-intel
authored andcommitted
platform/x86: asus-wmi: use brightness_set_blocking() for kbd led
kbd_led_set() can sleep, and so may not be used as the brightness_set() callback. Otherwise using this led with a trigger leads to system hangs accompanied by: BUG: scheduling while atomic: acpi_fakekeyd/2588/0x00000003 CPU: 4 UID: 0 PID: 2588 Comm: acpi_fakekeyd Not tainted 6.17.9+deb14-amd64 #1 PREEMPT(lazy) Debian 6.17.9-1 Hardware name: ASUSTeK COMPUTER INC. ASUS EXPERTBOOK B9403CVAR/B9403CVAR, BIOS B9403CVAR.311 12/24/2024 Call Trace: <TASK> [...] schedule_timeout+0xbd/0x100 __down_common+0x175/0x290 down_timeout+0x67/0x70 acpi_os_wait_semaphore+0x57/0x90 [...] asus_wmi_evaluate_method3+0x87/0x190 [asus_wmi] led_trigger_event+0x3f/0x60 [...] Fixes: 9fe44fc ("platform/x86: asus-wmi: Simplify the keyboard brightness updating process") Signed-off-by: Anton Khirnov <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Reviewed-by: Denis Benato <[email protected]> Link: https://patch.msgid.link/[email protected] Reviewed-by: Ilpo Järvinen <[email protected]> Signed-off-by: Ilpo Järvinen <[email protected]>
1 parent c36f9d7 commit ccb61a3

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/platform/x86/asus-wmi.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,14 +1704,14 @@ static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
17041704
kbd_led_update(asus);
17051705
}
17061706

1707-
static void kbd_led_set(struct led_classdev *led_cdev,
1708-
enum led_brightness value)
1707+
static int kbd_led_set(struct led_classdev *led_cdev, enum led_brightness value)
17091708
{
17101709
/* Prevent disabling keyboard backlight on module unregister */
17111710
if (led_cdev->flags & LED_UNREGISTERING)
1712-
return;
1711+
return 0;
17131712

17141713
do_kbd_led_set(led_cdev, value);
1714+
return 0;
17151715
}
17161716

17171717
static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
@@ -1887,7 +1887,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
18871887
asus->kbd_led_wk = led_val;
18881888
asus->kbd_led.name = "asus::kbd_backlight";
18891889
asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
1890-
asus->kbd_led.brightness_set = kbd_led_set;
1890+
asus->kbd_led.brightness_set_blocking = kbd_led_set;
18911891
asus->kbd_led.brightness_get = kbd_led_get;
18921892
asus->kbd_led.max_brightness = 3;
18931893

0 commit comments

Comments
 (0)