diff options
| author | Petr Hodina <petr.hodina@protonmail.com> | 2026-04-26 13:57:41 -0700 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2026-04-26 14:32:56 -0700 |
| commit | 8a1f9de80e45951b43d6e1e287a07f7d94cadbe8 (patch) | |
| tree | ac83473ac2d8ef9f645ea48fa3d50010a6b5ff70 /drivers/input | |
| parent | dd78ec391fbd56fad39e3c6d9a37e82df0439289 (diff) | |
Input: stmfts - add optional reset GPIO support
Add support for an optional "reset-gpios" property. If present, the
driver drives the reset line high at probe time and releases it during
power-on, after the regulators have been enabled.
Signed-off-by: Petr Hodina <petr.hodina@protonmail.com>
Co-developed-by: David Heidelberg <david@ixit.cz>
Signed-off-by: David Heidelberg <david@ixit.cz>
Link: https://patch.msgid.link/20260409-stmfts5-v4-8-64fe62027db5@ixit.cz
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/touchscreen/stmfts.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c index 1955419a0db5..43158d03ecc1 100644 --- a/drivers/input/touchscreen/stmfts.c +++ b/drivers/input/touchscreen/stmfts.c @@ -5,6 +5,7 @@ // Copyright (c) 2017 Andi Shyti <andi@etezian.org> #include <linux/delay.h> +#include <linux/gpio/consumer.h> #include <linux/i2c.h> #include <linux/input/mt.h> #include <linux/input/touchscreen.h> @@ -77,6 +78,7 @@ static const struct regulator_bulk_data stmfts_supplies[] = { struct stmfts_data { struct i2c_client *client; struct input_dev *input; + struct gpio_desc *reset_gpio; struct led_classdev led_cdev; struct mutex mutex; @@ -539,6 +541,15 @@ static int stmfts_read_system_info(struct stmfts_data *sdata) return 0; } +static void stmfts_reset(struct stmfts_data *sdata) +{ + gpiod_set_value_cansleep(sdata->reset_gpio, 1); + msleep(20); + + gpiod_set_value_cansleep(sdata->reset_gpio, 0); + msleep(50); +} + static int stmfts_configure(struct stmfts_data *sdata) { int err; @@ -585,6 +596,9 @@ static int stmfts_power_on(struct stmfts_data *sdata) */ msleep(20); + if (sdata->reset_gpio) + stmfts_reset(sdata); + err = stmfts_read_system_info(sdata); if (err) goto err_disable_regulators; @@ -617,6 +631,10 @@ static void stmfts_power_off(void *data) struct stmfts_data *sdata = data; disable_irq(sdata->client->irq); + + if (sdata->reset_gpio) + gpiod_set_value_cansleep(sdata->reset_gpio, 1); + regulator_bulk_disable(ARRAY_SIZE(stmfts_supplies), sdata->supplies); } @@ -672,6 +690,11 @@ static int stmfts_probe(struct i2c_client *client) if (err) return err; + sdata->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(sdata->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(sdata->reset_gpio), + "Failed to get GPIO 'reset'\n"); + sdata->input = devm_input_allocate_device(dev); if (!sdata->input) return -ENOMEM; |
