]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/x86: ideapad-laptop: Fix FnLock not remembered among boots
authorRong Zhang <i@rong.moe>
Mon, 7 Jul 2025 16:38:06 +0000 (00:38 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Aug 2025 08:48:42 +0000 (09:48 +0100)
commit 9533b789df7e8d273543a5991aec92447be043d7 upstream.

On devices supported by ideapad-laptop, the HW/FW can remember the
FnLock state among boots. However, since the introduction of the FnLock
LED class device, it is turned off while shutting down, as a side effect
of the LED class device unregistering sequence.

Many users always turn on FnLock because they use function keys much
more frequently than multimedia keys. The behavior change is
inconvenient for them. Thus, set LED_RETAIN_AT_SHUTDOWN on the LED class
device so that the FnLock state gets remembered, which also aligns with
the behavior of manufacturer utilities on Windows.

Fixes: 07f48f668fac ("platform/x86: ideapad-laptop: add FnLock LED class device")
Cc: stable@vger.kernel.org
Signed-off-by: Rong Zhang <i@rong.moe>
Reviewed-by: Hans de Goede <hansg@kernel.org>
Link: https://lore.kernel.org/r/20250707163808.155876-2-i@rong.moe
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/platform/x86/ideapad-laptop.c

index 93aa72bff3f00ddfc1879ed031191ce43f6edd48..6e6ec8c404d14a31a06c7190ff971c9dcc35a2b9 100644 (file)
@@ -1731,7 +1731,7 @@ static int ideapad_fn_lock_led_init(struct ideapad_private *priv)
        priv->fn_lock.led.name                    = "platform::" LED_FUNCTION_FNLOCK;
        priv->fn_lock.led.brightness_get          = ideapad_fn_lock_led_cdev_get;
        priv->fn_lock.led.brightness_set_blocking = ideapad_fn_lock_led_cdev_set;
-       priv->fn_lock.led.flags                   = LED_BRIGHT_HW_CHANGED;
+       priv->fn_lock.led.flags                   = LED_BRIGHT_HW_CHANGED | LED_RETAIN_AT_SHUTDOWN;
 
        err = led_classdev_register(&priv->platform_device->dev, &priv->fn_lock.led);
        if (err)