]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: stmfts - disable regulators and disable irq when power on fails
authorDavid Heidelberg <david@ixit.cz>
Sun, 26 Apr 2026 20:46:36 +0000 (13:46 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 26 Apr 2026 21:32:54 +0000 (14:32 -0700)
We must power off regulators and ensure that IRQ is disabled when
failing at power on phase. Create stmfts_configure function to limit
use of goto.

Signed-off-by: David Heidelberg <david@ixit.cz>
Link: https://patch.msgid.link/20260409-stmfts5-v4-5-64fe62027db5@ixit.cz
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/stmfts.c

index 1381a9ce23f2d985edcf156b71a32486956625e8..d52c4873dfb09c30a10eac9569ed17214b8420c2 100644 (file)
@@ -539,29 +539,10 @@ static int stmfts_read_system_info(struct stmfts_data *sdata)
        return 0;
 }
 
-static int stmfts_power_on(struct stmfts_data *sdata)
+static int stmfts_configure(struct stmfts_data *sdata)
 {
        int err;
 
-       err = regulator_bulk_enable(ARRAY_SIZE(stmfts_supplies),
-                                   sdata->supplies);
-       if (err)
-               return err;
-
-       /*
-        * The datasheet does not specify the power on time, but considering
-        * that the reset time is < 10ms, I sleep 20ms to be sure
-        */
-       msleep(20);
-
-       err = stmfts_read_system_info(sdata);
-       if (err)
-               return err;
-
-       enable_irq(sdata->client->irq);
-
-       msleep(50);
-
        err = stmfts_command(sdata, STMFTS_SYSTEM_RESET);
        if (err)
                return err;
@@ -586,13 +567,49 @@ static int stmfts_power_on(struct stmfts_data *sdata)
        if (err)
                return err;
 
+       return 0;
+}
+
+static int stmfts_power_on(struct stmfts_data *sdata)
+{
+       int err;
+
+       err = regulator_bulk_enable(ARRAY_SIZE(stmfts_supplies),
+                                   sdata->supplies);
+       if (err)
+               return err;
+
+       /*
+        * The datasheet does not specify the power on time, but considering
+        * that the reset time is < 10ms, I sleep 20ms to be sure
+        */
+       msleep(20);
+
+       err = stmfts_read_system_info(sdata);
+       if (err)
+               goto err_disable_regulators;
+
+       enable_irq(sdata->client->irq);
+
+       msleep(50);
+
+       err = stmfts_configure(sdata);
+       if (err)
+               goto err_disable_irq;
+
        /*
         * At this point no one is using the touchscreen
         * and I don't really care about the return value
         */
-       (void) i2c_smbus_write_byte(sdata->client, STMFTS_SLEEP_IN);
+       (void)i2c_smbus_write_byte(sdata->client, STMFTS_SLEEP_IN);
 
        return 0;
+
+err_disable_irq:
+       disable_irq(sdata->client->irq);
+err_disable_regulators:
+       regulator_bulk_disable(ARRAY_SIZE(stmfts_supplies), sdata->supplies);
+       return err;
 }
 
 static void stmfts_power_off(void *data)