lkml.org 
[lkml]   [2021]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 396/530] HID: lenovo: Use brightness_set_blocking callback for setting LEDs brightness
    Date
    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


    \
     
     \ /
      Last update: 2021-05-12 19:01    [W:4.046 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site