Input: stmfts - disable regulators and disable irq when power on fails

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>
This commit is contained in:
David Heidelberg authored and Thomas Makin committed 2026-10-16 10:05:11 -05:00
1 parent c9b03f2a90
commit f0054c977e
1 file changed
+38 -21
+38 -21
View 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)