summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2018-03-22 13:08:22 +0100
committerDominik Sliwa <dominik.sliwa@toradex.com>2018-06-19 16:30:30 +0200
commit28531a1ff5ca27c0ab7e2f99bbb0058858b72aa5 (patch)
tree0b8674a8b4e2058dd2e042fbb603b5f2fe215709
parent4d969d3357c16d71097b4a2b1a4076a2132e6057 (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.c23
-rw-r--r--include/linux/platform_data/atmel_mxt_ts.h1
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 */