diff options
author | Dominik Sliwa <dominik.sliwa@toradex.com> | 2018-03-22 13:08:22 +0100 |
---|---|---|
committer | Dominik Sliwa <dominik.sliwa@toradex.com> | 2018-06-19 16:30:30 +0200 |
commit | 28531a1ff5ca27c0ab7e2f99bbb0058858b72aa5 (patch) | |
tree | 0b8674a8b4e2058dd2e042fbb603b5f2fe215709 | |
parent | 4d969d3357c16d71097b4a2b1a4076a2132e6057 (diff) |
input: atmel_mxt_ts: support reset gpio line
Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com>
Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
(cherry picked from commit 22a2065b9a3fa6ad458e3100b66c4acaa05f2466)
Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
-rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 23 | ||||
-rw-r--r-- | include/linux/platform_data/atmel_mxt_ts.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 4ddbced67762..8f5c2814d64b 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -27,6 +27,7 @@ #include <linux/input/mt.h> #include <linux/interrupt.h> #include <linux/of.h> +#include <linux/of_gpio.h> #include <linux/slab.h> #include <asm/unaligned.h> #include <media/v4l2-device.h> @@ -2919,6 +2920,8 @@ static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) if (!pdata) return ERR_PTR(-ENOMEM); + pdata->gpio_reset = of_get_named_gpio(np, "reset-gpio", 0); + if (of_find_property(np, "linux,gpio-keymap", &proplen)) { pdata->t19_num_keys = proplen / sizeof(u32); @@ -3128,6 +3131,21 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) goto err_free_mem; } + if (pdata->gpio_reset >= 0) { + error = gpio_request(pdata->gpio_reset, "atmel-mxt-ts-reset"); + if (error < 0 ) { + dev_err(&client->dev, "Failure %d requesting reset " + "gpio\n", error); + goto err_free_mem; + } + error = gpio_direction_output(pdata->gpio_reset, 1); + if (error < 0 ) { + dev_err(&client->dev, "Failure %d setting reset gpio" + "direction\n", error); + goto err_free_gpio; + } + } + disable_irq(client->irq); #endif @@ -3149,6 +3167,9 @@ err_free_object: mxt_free_object_table(data); err_free_irq: free_irq(client->irq, data); +err_free_gpio: + if (pdata->gpio_reset >= 0) + gpio_free(pdata->gpio_reset); err_free_mem: kfree(data); return error; @@ -3160,6 +3181,8 @@ static int mxt_remove(struct i2c_client *client) sysfs_remove_group(&client->dev.kobj, &mxt_attr_group); free_irq(data->irq, data); + if (data->pdata->gpio_reset >= 0) + gpio_free(data->pdata->gpio_reset); mxt_free_input_device(data); mxt_free_object_table(data); kfree(data); diff --git a/include/linux/platform_data/atmel_mxt_ts.h b/include/linux/platform_data/atmel_mxt_ts.h index 695035a8d7fb..c59fc18118aa 100644 --- a/include/linux/platform_data/atmel_mxt_ts.h +++ b/include/linux/platform_data/atmel_mxt_ts.h @@ -26,6 +26,7 @@ struct mxt_platform_data { u8 t19_num_keys; const unsigned int *t19_keymap; enum mxt_suspend_mode suspend_mode; + int gpio_reset; }; #endif /* __LINUX_PLATFORM_DATA_ATMEL_MXT_TS_H */ |