OSDN Git Service

Input: ili210x - add reset GPIO support
authorMarek Vasut <marex@denx.de>
Thu, 7 Feb 2019 05:55:26 +0000 (21:55 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 7 Feb 2019 06:17:46 +0000 (22:17 -0800)
The touchscreen can have a reset GPIO connected to it, add support
for such an arrangement.

Signed-off-by: Marek Vasut <marex@denx.de>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/ili210x.c

index 788f414..f8b20d3 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/input/mt.h>
 #include <linux/delay.h>
 #include <linux/workqueue.h>
+#include <linux/gpio/consumer.h>
 
 #define MAX_TOUCHES            2
 #define DEFAULT_POLL_PERIOD    20
@@ -45,6 +46,7 @@ struct ili210x {
        struct input_dev *input;
        unsigned int poll_period;
        struct delayed_work dwork;
+       struct gpio_desc *reset_gpio;
 };
 
 static int ili210x_read_reg(struct i2c_client *client, u8 reg, void *buf,
@@ -168,11 +170,19 @@ static const struct attribute_group ili210x_attr_group = {
        .attrs = ili210x_attributes,
 };
 
+static void ili210x_power_down(void *data)
+{
+       struct gpio_desc *reset_gpio = data;
+
+       gpiod_set_value_cansleep(reset_gpio, 1);
+}
+
 static int ili210x_i2c_probe(struct i2c_client *client,
                                       const struct i2c_device_id *id)
 {
        struct device *dev = &client->dev;
        struct ili210x *priv;
+       struct gpio_desc *reset_gpio;
        struct input_dev *input;
        struct panel_info panel;
        struct firmware_version firmware;
@@ -186,6 +196,21 @@ static int ili210x_i2c_probe(struct i2c_client *client,
                return -EINVAL;
        }
 
+       reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(reset_gpio))
+               return PTR_ERR(reset_gpio);
+
+       if (reset_gpio) {
+               error = devm_add_action_or_reset(dev, ili210x_power_down,
+                                                reset_gpio);
+               if (error)
+                       return error;
+
+               usleep_range(50, 100);
+               gpiod_set_value_cansleep(reset_gpio, 0);
+               msleep(100);
+       }
+
        /* Get firmware version */
        error = ili210x_read_reg(client, REG_FIRMWARE_VERSION,
                                 &firmware, sizeof(firmware));
@@ -218,6 +243,7 @@ static int ili210x_i2c_probe(struct i2c_client *client,
        priv->input = input;
        priv->poll_period = DEFAULT_POLL_PERIOD;
        INIT_DELAYED_WORK(&priv->dwork, ili210x_work);
+       priv->reset_gpio = reset_gpio;
 
        /* Setup input device */
        input->name = "ILI210x Touchscreen";