HID: google: switch to devm when registering keyboard backlight LED
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 15 Mar 2022 02:30:13 +0000 (19:30 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 15 Mar 2022 04:11:07 +0000 (21:11 -0700)
We can use devm to register keyboard backlight LED on hammer devices, this
will allow us to use HID's driver data for something else later.

Link: https://lore.kernel.org/r/20220228075446.466016-2-dmitry.torokhov@gmail.com
Tested-by: Stephen Boyd <swboyd@chromium.org> # coachz, wormdingler
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/hid/hid-google-hammer.c

index 0403beb3104b9e47af2c7cb79acf734879e05b24..e7da4e74b4bf1d0d31d916a74e7659a0c548b795 100644 (file)
@@ -340,9 +340,9 @@ static int hammer_kbd_brightness_set_blocking(struct led_classdev *cdev,
 static int hammer_register_leds(struct hid_device *hdev)
 {
        struct hammer_kbd_leds *kbd_backlight;
-       int error;
 
-       kbd_backlight = kzalloc(sizeof(*kbd_backlight), GFP_KERNEL);
+       kbd_backlight = devm_kzalloc(&hdev->dev, sizeof(*kbd_backlight),
+                                    GFP_KERNEL);
        if (!kbd_backlight)
                return -ENOMEM;
 
@@ -356,26 +356,7 @@ static int hammer_register_leds(struct hid_device *hdev)
        /* Set backlight to 0% initially. */
        hammer_kbd_brightness_set_blocking(&kbd_backlight->cdev, 0);
 
-       error = led_classdev_register(&hdev->dev, &kbd_backlight->cdev);
-       if (error)
-               goto err_free_mem;
-
-       hid_set_drvdata(hdev, kbd_backlight);
-       return 0;
-
-err_free_mem:
-       kfree(kbd_backlight);
-       return error;
-}
-
-static void hammer_unregister_leds(struct hid_device *hdev)
-{
-       struct hammer_kbd_leds *kbd_backlight = hid_get_drvdata(hdev);
-
-       if (kbd_backlight) {
-               led_classdev_unregister(&kbd_backlight->cdev);
-               kfree(kbd_backlight);
-       }
+       return devm_led_classdev_register(&hdev->dev, &kbd_backlight->cdev);
 }
 
 #define HID_UP_GOOGLEVENDOR    0xffd10000
@@ -512,6 +493,11 @@ out:
        kfree(buf);
 }
 
+static void hammer_stop(void *hdev)
+{
+       hid_hw_stop(hdev);
+}
+
 static int hammer_probe(struct hid_device *hdev,
                        const struct hid_device_id *id)
 {
@@ -525,6 +511,10 @@ static int hammer_probe(struct hid_device *hdev,
        if (error)
                return error;
 
+       error = devm_add_action(&hdev->dev, hammer_stop, hdev);
+       if (error)
+               return error;
+
        /*
         * We always want to poll for, and handle tablet mode events from
         * devices that have folded usage, even when nobody has opened the input
@@ -577,9 +567,7 @@ static void hammer_remove(struct hid_device *hdev)
                spin_unlock_irqrestore(&cbas_ec_lock, flags);
        }
 
-       hammer_unregister_leds(hdev);
-
-       hid_hw_stop(hdev);
+       /* Unregistering LEDs and stopping the hardware is done via devm */
 }
 
 static const struct hid_device_id hammer_devices[] = {