Skip to content

Commit

Permalink
Input: zforce_ts - convert to use the gpiod interface
Browse files Browse the repository at this point in the history
Use the new GPIO descriptor interface to handle the zForce GPIOs.
This simplifies the code and allows transparently handle GPIO polarity, as
specified in device tree data.

Also switch to using gpio_{set|get}_value_cansleep() since none of the
callers is in atomic context and cansleep variant allows more GPIO
controllers to be used with the touchscreen.

Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Dirk Behme authored and Dmitry Torokhov committed Jul 9, 2015
1 parent b7e7932 commit 2d53809
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 31 deletions.
58 changes: 30 additions & 28 deletions drivers/input/touchscreen/zforce_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,13 @@
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/device.h>
#include <linux/sysfs.h>
#include <linux/input/mt.h>
#include <linux/platform_data/zforce_ts.h>
#include <linux/regulator/consumer.h>
#include <linux/of.h>
#include <linux/of_gpio.h>

#define WAIT_TIMEOUT msecs_to_jiffies(1000)

Expand Down Expand Up @@ -120,6 +119,9 @@ struct zforce_ts {

struct regulator *reg_vdd;

struct gpio_desc *gpio_int;
struct gpio_desc *gpio_rst;

bool suspending;
bool suspended;
bool boot_complete;
Expand Down Expand Up @@ -161,6 +163,16 @@ static int zforce_command(struct zforce_ts *ts, u8 cmd)
return 0;
}

static void zforce_reset_assert(struct zforce_ts *ts)
{
gpiod_set_value_cansleep(ts->gpio_rst, 1);
}

static void zforce_reset_deassert(struct zforce_ts *ts)
{
gpiod_set_value_cansleep(ts->gpio_rst, 0);
}

static int zforce_send_wait(struct zforce_ts *ts, const char *buf, int len)
{
struct i2c_client *client = ts->client;
Expand Down Expand Up @@ -479,7 +491,6 @@ static irqreturn_t zforce_irq_thread(int irq, void *dev_id)
{
struct zforce_ts *ts = dev_id;
struct i2c_client *client = ts->client;
const struct zforce_ts_platdata *pdata = ts->pdata;
int ret;
u8 payload_buffer[FRAME_MAXSIZE];
u8 *payload;
Expand All @@ -499,7 +510,7 @@ static irqreturn_t zforce_irq_thread(int irq, void *dev_id)
if (!ts->suspending && device_may_wakeup(&client->dev))
pm_stay_awake(&client->dev);

while (!gpio_get_value(pdata->gpio_int)) {
while (!gpiod_get_value_cansleep(ts->gpio_int)) {
ret = zforce_read_packet(ts, payload_buffer);
if (ret < 0) {
dev_err(&client->dev,
Expand Down Expand Up @@ -690,7 +701,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);

Expand All @@ -712,18 +723,6 @@ static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev)
return ERR_PTR(-ENOMEM);
}

pdata->gpio_int = of_get_gpio(np, 0);
if (!gpio_is_valid(pdata->gpio_int)) {
dev_err(dev, "failed to get interrupt gpio\n");
return ERR_PTR(-EINVAL);
}

pdata->gpio_rst = of_get_gpio(np, 1);
if (!gpio_is_valid(pdata->gpio_rst)) {
dev_err(dev, "failed to get reset gpio\n");
return ERR_PTR(-EINVAL);
}

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);
Expand Down Expand Up @@ -755,19 +754,22 @@ static int zforce_probe(struct i2c_client *client,
if (!ts)
return -ENOMEM;

ret = devm_gpio_request_one(&client->dev, pdata->gpio_int, GPIOF_IN,
"zforce_ts_int");
if (ret) {
dev_err(&client->dev, "request of gpio %d failed, %d\n",
pdata->gpio_int, ret);
/* INT GPIO */
ts->gpio_int = devm_gpiod_get_index(&client->dev, NULL, 0, GPIOD_IN);
if (IS_ERR(ts->gpio_int)) {
ret = PTR_ERR(ts->gpio_int);
dev_err(&client->dev,
"failed to request interrupt GPIO: %d\n", ret);
return ret;
}

ret = devm_gpio_request_one(&client->dev, pdata->gpio_rst,
GPIOF_OUT_INIT_LOW, "zforce_ts_rst");
if (ret) {
dev_err(&client->dev, "request of gpio %d failed, %d\n",
pdata->gpio_rst, ret);
/* RST GPIO */
ts->gpio_rst = devm_gpiod_get_index(&client->dev, NULL, 1,
GPIOD_OUT_HIGH);
if (IS_ERR(ts->gpio_rst)) {
ret = PTR_ERR(ts->gpio_rst);
dev_err(&client->dev,
"failed to request reset GPIO: %d\n", ret);
return ret;
}

Expand Down Expand Up @@ -863,7 +865,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)
Expand Down
3 changes: 0 additions & 3 deletions include/linux/platform_data/zforce_ts.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@
#define _LINUX_INPUT_ZFORCE_TS_H

struct zforce_ts_platdata {
int gpio_int;
int gpio_rst;

unsigned int x_max;
unsigned int y_max;
};
Expand Down

0 comments on commit 2d53809

Please sign in to comment.