]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/input/touchscreen/edt-ft5x06.c
Input: edt-ft5x06 - switch to newer gpio framework
[karo-tx-linux.git] / drivers / input / touchscreen / edt-ft5x06.c
index e6aef3e48bd9207f982a73da37e60537c491835c..5738722873bbe46a208888a8f0d89d2eff7d0636 100644 (file)
@@ -34,8 +34,7 @@
 #include <linux/delay.h>
 #include <linux/debugfs.h>
 #include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/input/mt.h>
 #include <linux/input/touchscreen.h>
 #include <linux/input/edt-ft5x06.h>
@@ -91,9 +90,9 @@ struct edt_ft5x06_ts_data {
        u16 num_x;
        u16 num_y;
 
-       int reset_pin;
-       int irq_pin;
-       int wake_pin;
+       struct gpio_desc *reset_gpio;
+       struct gpio_desc *wake_gpio;
+       struct gpio_desc *irq_gpio;
 
 #if defined(CONFIG_DEBUG_FS)
        struct dentry *debug_dir;
@@ -752,45 +751,6 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
 
 #endif /* CONFIG_DEBUGFS */
 
-static int edt_ft5x06_ts_reset(struct i2c_client *client,
-                       struct edt_ft5x06_ts_data *tsdata)
-{
-       int error;
-
-       if (gpio_is_valid(tsdata->wake_pin)) {
-               error = devm_gpio_request_one(&client->dev,
-                                       tsdata->wake_pin, GPIOF_OUT_INIT_LOW,
-                                       "edt-ft5x06 wake");
-               if (error) {
-                       dev_err(&client->dev,
-                               "Failed to request GPIO %d as wake pin, error %d\n",
-                               tsdata->wake_pin, error);
-                       return error;
-               }
-
-               msleep(5);
-               gpio_set_value(tsdata->wake_pin, 1);
-       }
-       if (gpio_is_valid(tsdata->reset_pin)) {
-               /* this pulls reset down, enabling the low active reset */
-               error = devm_gpio_request_one(&client->dev,
-                                       tsdata->reset_pin, GPIOF_OUT_INIT_LOW,
-                                       "edt-ft5x06 reset");
-               if (error) {
-                       dev_err(&client->dev,
-                               "Failed to request GPIO %d as reset pin, error %d\n",
-                               tsdata->reset_pin, error);
-                       return error;
-               }
-
-               msleep(5);
-               gpio_set_value(tsdata->reset_pin, 1);
-               msleep(300);
-       }
-
-       return 0;
-}
-
 static int edt_ft5x06_ts_identify(struct i2c_client *client,
                                        struct edt_ft5x06_ts_data *tsdata,
                                        char *fw_version)
@@ -931,30 +891,6 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata)
        }
 }
 
-#ifdef CONFIG_OF
-static int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
-                               struct edt_ft5x06_ts_data *tsdata)
-{
-       struct device_node *np = dev->of_node;
-
-       /*
-        * irq_pin is not needed for DT setup.
-        * irq is associated via 'interrupts' property in DT
-        */
-       tsdata->irq_pin = -EINVAL;
-       tsdata->reset_pin = of_get_named_gpio(np, "reset-gpios", 0);
-       tsdata->wake_pin = of_get_named_gpio(np, "wake-gpios", 0);
-
-       return 0;
-}
-#else
-static inline int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
-                                       struct edt_ft5x06_ts_data *tsdata)
-{
-       return -ENODEV;
-}
-#endif
-
 static int edt_ft5x06_ts_probe(struct i2c_client *client,
                                         const struct i2c_device_id *id)
 {
@@ -973,32 +909,42 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
                return -ENOMEM;
        }
 
-       if (!pdata) {
-               error = edt_ft5x06_i2c_ts_probe_dt(&client->dev, tsdata);
-               if (error) {
-                       dev_err(&client->dev,
-                               "DT probe failed and no platform data present\n");
-                       return error;
-               }
-       } else {
-               tsdata->reset_pin = pdata->reset_pin;
-               tsdata->irq_pin = pdata->irq_pin;
-               tsdata->wake_pin = -EINVAL;
+       tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev,
+                                                    "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(tsdata->reset_gpio)) {
+               error = PTR_ERR(tsdata->reset_gpio);
+               dev_err(&client->dev,
+                       "Failed to request GPIO reset pin, error %d\n", error);
+               return error;
        }
 
-       error = edt_ft5x06_ts_reset(client, tsdata);
-       if (error)
+       tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev,
+                                                   "wake", GPIOD_OUT_LOW);
+       if (IS_ERR(tsdata->wake_gpio)) {
+               error = PTR_ERR(tsdata->wake_gpio);
+               dev_err(&client->dev,
+                       "Failed to request GPIO wake pin, error %d\n", error);
                return error;
+       }
 
-       if (gpio_is_valid(tsdata->irq_pin)) {
-               error = devm_gpio_request_one(&client->dev, tsdata->irq_pin,
-                                       GPIOF_IN, "edt-ft5x06 irq");
-               if (error) {
-                       dev_err(&client->dev,
-                               "Failed to request GPIO %d, error %d\n",
-                               tsdata->irq_pin, error);
-                       return error;
-               }
+       tsdata->irq_gpio = devm_gpiod_get_optional(&client->dev,
+                                                  "irq", GPIOD_IN);
+       if (IS_ERR(tsdata->irq_gpio)) {
+               error = PTR_ERR(tsdata->irq_gpio);
+               dev_err(&client->dev,
+                       "Failed to request GPIO irq pin, error %d\n", error);
+               return error;
+       }
+
+       if (tsdata->wake_gpio) {
+               usleep_range(5000, 6000);
+               gpiod_set_value_cansleep(tsdata->wake_gpio, 1);
+       }
+
+       if (tsdata->reset_gpio) {
+               usleep_range(5000, 6000);
+               gpiod_set_value_cansleep(tsdata->reset_gpio, 0);
+               msleep(300);
        }
 
        input = devm_input_allocate_device(&client->dev);
@@ -1035,20 +981,15 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
        input->id.bustype = BUS_I2C;
        input->dev.parent = &client->dev;
 
-       __set_bit(EV_KEY, input->evbit);
-       __set_bit(EV_ABS, input->evbit);
-       __set_bit(BTN_TOUCH, input->keybit);
-       input_set_abs_params(input, ABS_X, 0, tsdata->num_x * 64 - 1, 0, 0);
-       input_set_abs_params(input, ABS_Y, 0, tsdata->num_y * 64 - 1, 0, 0);
        input_set_abs_params(input, ABS_MT_POSITION_X,
                             0, tsdata->num_x * 64 - 1, 0, 0);
        input_set_abs_params(input, ABS_MT_POSITION_Y,
                             0, tsdata->num_y * 64 - 1, 0, 0);
 
        if (!pdata)
-               touchscreen_parse_of_params(input);
+               touchscreen_parse_properties(input, true);
 
-       error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, 0);
+       error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, INPUT_MT_DIRECT);
        if (error) {
                dev_err(&client->dev, "Unable to init MT slots.\n");
                return error;
@@ -1079,7 +1020,8 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
 
        dev_dbg(&client->dev,
                "EDT FT5x06 initialized: IRQ %d, WAKE pin %d, Reset pin %d.\n",
-               client->irq, tsdata->wake_pin, tsdata->reset_pin);
+               client->irq, desc_to_gpio(tsdata->wake_gpio),
+               desc_to_gpio(tsdata->reset_gpio));
 
        return 0;
 
@@ -1139,7 +1081,6 @@ MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match);
 
 static struct i2c_driver edt_ft5x06_ts_driver = {
        .driver = {
-               .owner = THIS_MODULE,
                .name = "edt_ft5x06",
                .of_match_table = of_match_ptr(edt_ft5x06_of_match),
                .pm = &edt_ft5x06_ts_pm_ops,