@@ -162,6 +162,20 @@ static int zforce_command(struct zforce_ts *ts, u8 cmd)
return 0;
}
+static void zforce_reset_assert(struct zforce_ts *ts)
+{
+ const struct zforce_ts_platdata *pdata = ts->pdata;
+
+ gpio_set_value(pdata->gpio_rst, pdata->reset_active_low ? 0 : 1);
+}
+
+static void zforce_reset_deassert(struct zforce_ts *ts)
+{
+ const struct zforce_ts_platdata *pdata = ts->pdata;
+
+ gpio_set_value(pdata->gpio_rst, pdata->reset_active_low ? 1 : 0);
+}
+
static int zforce_send_wait(struct zforce_ts *ts, const char *buf, int len)
{
struct i2c_client *client = ts->client;
@@ -691,7 +705,7 @@ static void zforce_reset(void *data)
{
struct zforce_ts *ts = data;
- gpio_set_value(ts->pdata->gpio_rst, 0);
+ zforce_reset_assert(ts);
udelay(10);
@@ -703,6 +717,7 @@ static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev)
{
struct zforce_ts_platdata *pdata;
struct device_node *np = dev->of_node;
+ enum of_gpio_flags flags;
if (!np)
return ERR_PTR(-ENOENT);
@@ -719,12 +734,14 @@ static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev)
return ERR_PTR(-EINVAL);
}
- pdata->gpio_rst = of_get_gpio(np, 1);
+ pdata->gpio_rst = of_get_gpio_flags(np, 1, &flags);
if (!gpio_is_valid(pdata->gpio_rst)) {
dev_err(dev, "failed to get reset gpio\n");
return ERR_PTR(-EINVAL);
}
+ pdata->reset_active_low = flags & OF_GPIO_ACTIVE_LOW;
+
if (of_property_read_u32(np, "x-size", &pdata->x_max)) {
dev_err(dev, "failed to get x-size property\n");
return ERR_PTR(-EINVAL);
@@ -765,7 +782,9 @@ static int zforce_probe(struct i2c_client *client,
}
ret = devm_gpio_request_one(&client->dev, pdata->gpio_rst,
- GPIOF_OUT_INIT_LOW, "zforce_ts_rst");
+ pdata->reset_active_low ?
+ GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
+ "zforce_ts_rst");
if (ret) {
dev_err(&client->dev, "request of gpio %d failed, %d\n",
pdata->gpio_rst, ret);
@@ -864,7 +883,7 @@ static int zforce_probe(struct i2c_client *client,
i2c_set_clientdata(client, ts);
/* let the controller boot */
- gpio_set_value(pdata->gpio_rst, 1);
+ zforce_reset_deassert(ts);
ts->command_waiting = NOTIFICATION_BOOTCOMPLETE;
if (wait_for_completion_timeout(&ts->command_done, WAIT_TIMEOUT) == 0)
@@ -15,9 +15,12 @@
#ifndef _LINUX_INPUT_ZFORCE_TS_H
#define _LINUX_INPUT_ZFORCE_TS_H
+#include <linux/of_gpio.h>
+
struct zforce_ts_platdata {
int gpio_int;
int gpio_rst;
+ enum of_gpio_flags reset_active_low;
unsigned int x_max;
unsigned int y_max;