Input: stmfts - acknowledge that setting brightness is a blocking call
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 5 Feb 2019 22:40:40 +0000 (14:40 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 8 Feb 2019 07:41:11 +0000 (23:41 -0800)
We need to turn regulators on and off when switching brightness, and
that may block, therefore we have to set stmfts_brightness_set() as
LED's brightness_set_blocking() method.

Fixes: 78bcac7b2ae1 ("Input: add support for the STMicroelectronics FingerTip touchscreen")
Acked-by: Andi Shyti <andi@etezian.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/stmfts.c

index 704e990..b6f95f2 100644 (file)
@@ -106,27 +106,29 @@ struct stmfts_data {
        bool running;
 };
 
-static void stmfts_brightness_set(struct led_classdev *led_cdev,
+static int stmfts_brightness_set(struct led_classdev *led_cdev,
                                        enum led_brightness value)
 {
        struct stmfts_data *sdata = container_of(led_cdev,
                                        struct stmfts_data, led_cdev);
        int err;
 
-       if (value == sdata->led_status || !sdata->ledvdd)
-               return;
-
-       if (!value) {
-               regulator_disable(sdata->ledvdd);
-       } else {
-               err = regulator_enable(sdata->ledvdd);
-               if (err)
-                       dev_warn(&sdata->client->dev,
-                                "failed to disable ledvdd regulator: %d\n",
-                                err);
+       if (value != sdata->led_status && sdata->ledvdd) {
+               if (!value) {
+                       regulator_disable(sdata->ledvdd);
+               } else {
+                       err = regulator_enable(sdata->ledvdd);
+                       if (err) {
+                               dev_warn(&sdata->client->dev,
+                                        "failed to disable ledvdd regulator: %d\n",
+                                        err);
+                               return err;
+                       }
+               }
+               sdata->led_status = value;
        }
 
-       sdata->led_status = value;
+       return 0;
 }
 
 static enum led_brightness stmfts_brightness_get(struct led_classdev *led_cdev)
@@ -608,7 +610,7 @@ static int stmfts_enable_led(struct stmfts_data *sdata)
        sdata->led_cdev.name = STMFTS_DEV_NAME;
        sdata->led_cdev.max_brightness = LED_ON;
        sdata->led_cdev.brightness = LED_OFF;
-       sdata->led_cdev.brightness_set = stmfts_brightness_set;
+       sdata->led_cdev.brightness_set_blocking = stmfts_brightness_set;
        sdata->led_cdev.brightness_get = stmfts_brightness_get;
 
        err = devm_led_classdev_register(&sdata->client->dev, &sdata->led_cdev);