| From 432e351f930686fd81c5ed506c72df64482deead Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 4 Apr 2021 10:04:24 +0200 |
| Subject: HID: lenovo: Use brightness_set_blocking callback for setting LEDs |
| brightness |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| [ Upstream commit bbf62645255f120bc2e7488c237e3f04da42ec70 ] |
| |
| The lenovo_led_brightness_set function may sleep, so we should have the |
| the led_class_dev's brightness_set_blocking callback point to it, rather |
| then the regular brightness_set callback. |
| |
| When toggled through sysfs this is not a problem, but the brightness_set |
| callback may be called from atomic context when using LED-triggers. |
| |
| Fixes: bc04b37ea0ec ("HID: lenovo: Add ThinkPad 10 Ultrabook Keyboard support") |
| Reviewed-by: Marek BehĂșn <kabel@kernel.org> |
| Acked-by: Pavel Machek <pavel@ucw.cz> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/hid/hid-lenovo.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c |
| index c6c8e20f3e8d..4dc5e5f932ed 100644 |
| --- a/drivers/hid/hid-lenovo.c |
| +++ b/drivers/hid/hid-lenovo.c |
| @@ -777,7 +777,7 @@ static enum led_brightness lenovo_led_brightness_get( |
| : LED_OFF; |
| } |
| |
| -static void lenovo_led_brightness_set(struct led_classdev *led_cdev, |
| +static int lenovo_led_brightness_set(struct led_classdev *led_cdev, |
| enum led_brightness value) |
| { |
| struct device *dev = led_cdev->dev->parent; |
| @@ -802,6 +802,8 @@ static void lenovo_led_brightness_set(struct led_classdev *led_cdev, |
| lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value); |
| break; |
| } |
| + |
| + return 0; |
| } |
| |
| static int lenovo_register_leds(struct hid_device *hdev) |
| @@ -822,7 +824,7 @@ static int lenovo_register_leds(struct hid_device *hdev) |
| |
| data->led_mute.name = name_mute; |
| data->led_mute.brightness_get = lenovo_led_brightness_get; |
| - data->led_mute.brightness_set = lenovo_led_brightness_set; |
| + data->led_mute.brightness_set_blocking = lenovo_led_brightness_set; |
| data->led_mute.dev = &hdev->dev; |
| ret = led_classdev_register(&hdev->dev, &data->led_mute); |
| if (ret < 0) |
| @@ -830,7 +832,7 @@ static int lenovo_register_leds(struct hid_device *hdev) |
| |
| data->led_micmute.name = name_micm; |
| data->led_micmute.brightness_get = lenovo_led_brightness_get; |
| - data->led_micmute.brightness_set = lenovo_led_brightness_set; |
| + data->led_micmute.brightness_set_blocking = lenovo_led_brightness_set; |
| data->led_micmute.dev = &hdev->dev; |
| ret = led_classdev_register(&hdev->dev, &data->led_micmute); |
| if (ret < 0) { |
| -- |
| 2.30.2 |
| |