diff mbox series

platform/x86: asus-wmi: Only notify kbd LED hw_change by fn-key pressed

Message ID 20181022100004.19999-1-drake@endlessm.com (mailing list archive)
State Accepted, archived
Delegated to: Andy Shevchenko
Headers show
Series platform/x86: asus-wmi: Only notify kbd LED hw_change by fn-key pressed | expand

Commit Message

Daniel Drake Oct. 22, 2018, 10 a.m. UTC
From: Jian-Hong Pan <jian-hong@endlessm.com>

Since commit dbb3d78f61ba ("platform/x86: asus-wmi: Call led hw_changed
API on kbd brightness change"), asus-wmi directly changes the keyboard
LED brightness when the keyboard brightness keys are pressed,
raising the appropriate notification.

However, this notification was unintentionally also being raised during
boot and resume from suspend. This was resulting in userspace showing
the keyboard LED OSD on resume for no good reason.

Move the keyboard LED brightness changed notification
from kbd_led_update to the new kbd_led_set_by_kbd function which is only
called from the keyboard brightness function keys codepath.

Signed-off-by: Jian-Hong Pan <jian-hong@endlessm.com>
Signed-off-by: Daniel Drake <drake@endlessm.com>
---
 drivers/platform/x86/asus-wmi.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Andy Shevchenko Oct. 29, 2018, 2:22 p.m. UTC | #1
On Mon, Oct 22, 2018 at 1:00 PM Daniel Drake <drake@endlessm.com> wrote:
>
> From: Jian-Hong Pan <jian-hong@endlessm.com>
>
> Since commit dbb3d78f61ba ("platform/x86: asus-wmi: Call led hw_changed
> API on kbd brightness change"), asus-wmi directly changes the keyboard
> LED brightness when the keyboard brightness keys are pressed,
> raising the appropriate notification.
>
> However, this notification was unintentionally also being raised during
> boot and resume from suspend. This was resulting in userspace showing
> the keyboard LED OSD on resume for no good reason.
>
> Move the keyboard LED brightness changed notification
> from kbd_led_update to the new kbd_led_set_by_kbd function which is only
> called from the keyboard brightness function keys codepath.
>

Pushed to my review and testing queue, thanks!


> Signed-off-by: Jian-Hong Pan <jian-hong@endlessm.com>
> Signed-off-by: Daniel Drake <drake@endlessm.com>
> ---
>  drivers/platform/x86/asus-wmi.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> index 9441cce636e6..a805227b31e1 100644
> --- a/drivers/platform/x86/asus-wmi.c
> +++ b/drivers/platform/x86/asus-wmi.c
> @@ -467,7 +467,6 @@ static void kbd_led_update(struct asus_wmi *asus)
>                 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
>
>         asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
> -       led_classdev_notify_brightness_hw_changed(&asus->kbd_led, asus->kbd_led_wk);
>  }
>
>  static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
> @@ -521,6 +520,14 @@ static void kbd_led_set(struct led_classdev *led_cdev,
>         do_kbd_led_set(led_cdev, value);
>  }
>
> +static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
> +{
> +       struct led_classdev *led_cdev = &asus->kbd_led;
> +
> +       do_kbd_led_set(led_cdev, value);
> +       led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
> +}
> +
>  static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
>  {
>         struct asus_wmi *asus;
> @@ -1759,18 +1766,18 @@ static void asus_wmi_notify(u32 value, void *context)
>         }
>
>         if (code == NOTIFY_KBD_BRTUP) {
> -               do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1);
> +               kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
>                 goto exit;
>         }
>         if (code == NOTIFY_KBD_BRTDWN) {
> -               do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk - 1);
> +               kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
>                 goto exit;
>         }
>         if (code == NOTIFY_KBD_BRTTOGGLE) {
>                 if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
> -                       do_kbd_led_set(&asus->kbd_led, 0);
> +                       kbd_led_set_by_kbd(asus, 0);
>                 else
> -                       do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1);
> +                       kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
>                 goto exit;
>         }
>
> --
> 2.17.1
>
diff mbox series

Patch

diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index 9441cce636e6..a805227b31e1 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -467,7 +467,6 @@  static void kbd_led_update(struct asus_wmi *asus)
 		ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
 
 	asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
-	led_classdev_notify_brightness_hw_changed(&asus->kbd_led, asus->kbd_led_wk);
 }
 
 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
@@ -521,6 +520,14 @@  static void kbd_led_set(struct led_classdev *led_cdev,
 	do_kbd_led_set(led_cdev, value);
 }
 
+static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
+{
+	struct led_classdev *led_cdev = &asus->kbd_led;
+
+	do_kbd_led_set(led_cdev, value);
+	led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
+}
+
 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
 {
 	struct asus_wmi *asus;
@@ -1759,18 +1766,18 @@  static void asus_wmi_notify(u32 value, void *context)
 	}
 
 	if (code == NOTIFY_KBD_BRTUP) {
-		do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1);
+		kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
 		goto exit;
 	}
 	if (code == NOTIFY_KBD_BRTDWN) {
-		do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk - 1);
+		kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
 		goto exit;
 	}
 	if (code == NOTIFY_KBD_BRTTOGGLE) {
 		if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
-			do_kbd_led_set(&asus->kbd_led, 0);
+			kbd_led_set_by_kbd(asus, 0);
 		else
-			do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1);
+			kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
 		goto exit;
 	}