From: Knut Wohlrab <Knut.Wohlrab@xxxxxxxxxxxx> According to Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt the RST GPIO is supposed to provide a polarity flag parameter gpios = <&GPIO_BANK GPIO_NUMBER GPIO_POLARITY> with GPIO_POLARITY reset active low = 1 (GPIO_ACTIVE_LOW) reset active high = 0 (GPIO_ACTIVE_HIGH) Example for GPIO_ACTIVE_LOW (1) reset GPIO: zforce_ts@50 { /* Neonode zForce I2C */ compatible = "neonode,zforce-ts"; ... gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>, /* INT */ <&gpio1 29 GPIO_ACTIVE_LOW>; /* RST */ ... }; Add the missing polarity flag evaluation to the driver. Signed-off-by: Knut Wohlrab <Knut.Wohlrab@xxxxxxxxxxxx> Signed-off-by: Oleksij Rempel <external.Oleksij.Rempel@xxxxxxxxxxxx> Signed-off-by: Dirk Behme <dirk.behme@xxxxxxxxxxxx> --- drivers/input/touchscreen/zforce_ts.c | 27 +++++++++++++++++++++++---- include/linux/platform_data/zforce_ts.h | 3 +++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/input/touchscreen/zforce_ts.c b/drivers/input/touchscreen/zforce_ts.c index 19880c7..125311d 100644 --- a/drivers/input/touchscreen/zforce_ts.c +++ b/drivers/input/touchscreen/zforce_ts.c @@ -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) diff --git a/include/linux/platform_data/zforce_ts.h b/include/linux/platform_data/zforce_ts.h index 0472ab2..44cd90f 100644 --- a/include/linux/platform_data/zforce_ts.h +++ b/include/linux/platform_data/zforce_ts.h @@ -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; -- 2.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html