HID: google: Enable PM Full On mode when adjusting backlight
authorHaridhar Kalvala <haridhar.kalvala@intel.com>
Wed, 28 Mar 2018 06:16:10 +0000 (14:16 +0800)
committerJiri Kosina <jkosina@suse.cz>
Wed, 28 Mar 2018 14:12:58 +0000 (16:12 +0200)
hammer LED backlight brightness is not getting set when USB
device is in suspend state.

This patch fixes the issue by requesting USB HID device to be
in FULLON mode, so that sending hardware output report and
hardware raw request won't fail to set brightness, and set
device back to NORMAL mode once this call returns.

Signed-off-by: Haridhar Kalvala <haridhar.kalvala@intel.com>
Reviewed-by: Dmitry Torokhov <dtor@chromium.org>
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-google-hammer.c

index 6486469ce0f64cc0f0d1e9d638736a1d68e576ef..7b8e17b03cb864a7bc0ab0cbd114594b01f28c5c 100644 (file)
@@ -41,6 +41,16 @@ static int hammer_kbd_brightness_set_blocking(struct led_classdev *cdev,
        led->buf[0] = 0;
        led->buf[1] = br;
 
+       /*
+        * Request USB HID device to be in Full On mode, so that sending
+        * hardware output report and hardware raw request won't fail.
+        */
+       ret = hid_hw_power(led->hdev, PM_HINT_FULLON);
+       if (ret < 0) {
+               hid_err(led->hdev, "failed: device not resumed %d\n", ret);
+               return ret;
+       }
+
        ret = hid_hw_output_report(led->hdev, led->buf, sizeof(led->buf));
        if (ret == -ENOSYS)
                ret = hid_hw_raw_request(led->hdev, 0, led->buf,
@@ -50,6 +60,10 @@ static int hammer_kbd_brightness_set_blocking(struct led_classdev *cdev,
        if (ret < 0)
                hid_err(led->hdev, "failed to set keyboard backlight: %d\n",
                        ret);
+
+       /* Request USB HID device back to Normal Mode. */
+       hid_hw_power(led->hdev, PM_HINT_NORMAL);
+
        return ret;
 }