platform/x86: dell-laptop: Use brightness_set_blocking for kbd_led_level_set
authorHans de Goede <hdegoede@redhat.com>
Wed, 26 Oct 2016 15:17:44 +0000 (17:17 +0200)
committerDarren Hart <dvhart@linux.intel.com>
Tue, 13 Dec 2016 17:29:08 +0000 (09:29 -0800)
kbd_led_level_set uses dell_smbios call which blocks, so the kbd_led
classdev should use the brightness_set_blocking callback.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
drivers/platform/x86/dell-laptop.c

index 2c2f02b2e08a13a7421cbcc73aaad4f8ecce0afa..14392a01ab360aceaf80c8424e2b4854ac5ea264 100644 (file)
@@ -1904,38 +1904,40 @@ static enum led_brightness kbd_led_level_get(struct led_classdev *led_cdev)
        return 0;
 }
 
-static void kbd_led_level_set(struct led_classdev *led_cdev,
-                             enum led_brightness value)
+static int kbd_led_level_set(struct led_classdev *led_cdev,
+                            enum led_brightness value)
 {
        struct kbd_state state;
        struct kbd_state new_state;
        u16 num;
+       int ret;
 
        if (kbd_get_max_level()) {
-               if (kbd_get_state(&state))
-                       return;
+               ret = kbd_get_state(&state);
+               if (ret)
+                       return ret;
                new_state = state;
-               if (kbd_set_level(&new_state, value))
-                       return;
-               kbd_set_state_safe(&new_state, &state);
-               return;
+               ret = kbd_set_level(&new_state, value);
+               if (ret)
+                       return ret;
+               return kbd_set_state_safe(&new_state, &state);
        }
 
        if (kbd_get_valid_token_counts()) {
                for (num = kbd_token_bits; num != 0 && value > 0; --value)
                        num &= num - 1; /* clear the first bit set */
                if (num == 0)
-                       return;
-               kbd_set_token_bit(ffs(num) - 1);
-               return;
+                       return 0;
+               return kbd_set_token_bit(ffs(num) - 1);
        }
 
        pr_warn("Keyboard brightness level control not supported\n");
+       return -ENXIO;
 }
 
 static struct led_classdev kbd_led = {
        .name           = "dell::kbd_backlight",
-       .brightness_set = kbd_led_level_set,
+       .brightness_set_blocking = kbd_led_level_set,
        .brightness_get = kbd_led_level_get,
        .groups         = kbd_led_groups,
 };