|
|
@@ -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)
|
|
|
|
|
|
@@ -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;
|
|
|
@@ -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;
|
|
|
@@ -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;
|
|
|
@@ -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,
|
|
|
@@ -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);
|
|
|
|
|
|
@@ -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);
|
|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
@@ -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)
|