Merge tag 'v4.3-rc3' into next
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 29 Sep 2015 23:28:52 +0000 (16:28 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 29 Sep 2015 23:28:52 +0000 (16:28 -0700)
Merge with Linux 4.3-rc3 to bring in MFD DA9062 changes to merge DA9062
OnKey driver.

17 files changed:
Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
arch/arm/boot/dts/am437x-sk-evm.dts
arch/arm/boot/dts/imx28-tx28.dts
arch/arm/boot/dts/imx53-tx53-x03x.dts
arch/arm/boot/dts/imx6qdl-tx6.dtsi
drivers/input/ff-core.c
drivers/input/joystick/db9.c
drivers/input/joystick/gamecon.c
drivers/input/joystick/turbografx.c
drivers/input/joystick/walkera0701.c
drivers/input/keyboard/omap4-keypad.c
drivers/input/misc/ad714x-i2c.c
drivers/input/misc/ad714x-spi.c
drivers/input/misc/ad714x.c
drivers/input/misc/ad714x.h
drivers/input/touchscreen/edt-ft5x06.c
include/linux/input/edt-ft5x06.h [deleted file]

index 76db967..bedd7dd 100644 (file)
@@ -49,7 +49,7 @@ Example:
                pinctrl-names = "default";
                pinctrl-0 = <&edt_ft5x06_pins>;
                interrupt-parent = <&gpio2>;
-               interrupts = <5 0>;
-               reset-gpios = <&gpio2 6 1>;
-               wake-gpios = <&gpio4 9 0>;
+               interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
+               reset-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
+               wake-gpios = <&gpio4 9 GPIO_ACTIVE_HIGH>;
        };
index 7da7c2d..0bb36e9 100644 (file)
 
                reg = <0x38>;
                interrupt-parent = <&gpio0>;
-               interrupts = <31 0>;
+               interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
 
                reset-gpios = <&gpio1 28 GPIO_ACTIVE_LOW>;
 
index a5b27c8..4ea8934 100644 (file)
@@ -13,6 +13,7 @@
 /dts-v1/;
 #include "imx28.dtsi"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
 
 / {
        model = "Ka-Ro electronics TX28 module";
                pinctrl-names = "default";
                pinctrl-0 = <&tx28_edt_ft5x06_pins>;
                interrupt-parent = <&gpio2>;
-               interrupts = <5 0>;
+               interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
                reset-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
                wake-gpios = <&gpio4 9 GPIO_ACTIVE_HIGH>;
        };
index 3b73e81..13e842b 100644 (file)
@@ -12,6 +12,7 @@
 /dts-v1/;
 #include "imx53-tx53.dtsi"
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/pwm/pwm.h>
 
 / {
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_edt_ft5x06_1>;
                interrupt-parent = <&gpio6>;
-               interrupts = <15 0>;
+               interrupts = <15 IRQ_TYPE_EDGE_FALLING>;
                reset-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>;
                wake-gpios = <&gpio2 21 GPIO_ACTIVE_HIGH>;
        };
index da08de3..13cb7cc 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/pwm/pwm.h>
 
 / {
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_edt_ft5x06>;
                interrupt-parent = <&gpio6>;
-               interrupts = <15 0>;
+               interrupts = <15 IRQ_TYPE_EDGE_FALLING>;
                reset-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>;
                wake-gpios = <&gpio2 21 GPIO_ACTIVE_HIGH>;
                linux,wakeup;
index c642082..eab56c0 100644 (file)
@@ -273,14 +273,14 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
 
        switch (code) {
        case FF_GAIN:
-               if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff)
+               if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffffU)
                        break;
 
                ff->set_gain(dev, value);
                break;
 
        case FF_AUTOCENTER:
-               if (!test_bit(FF_AUTOCENTER, dev->ffbit) || value > 0xffff)
+               if (!test_bit(FF_AUTOCENTER, dev->ffbit) || value > 0xffffU)
                        break;
 
                ff->set_autocenter(dev, value);
index 8e7de5c..cf1f602 100644 (file)
@@ -48,7 +48,7 @@ struct db9_config {
 };
 
 #define DB9_MAX_PORTS          3
-static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata;
+static struct db9_config db9_cfg[DB9_MAX_PORTS];
 
 module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0);
 MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)");
@@ -106,6 +106,7 @@ struct db9 {
        struct pardevice *pd;
        int mode;
        int used;
+       int parportno;
        struct mutex mutex;
        char phys[DB9_MAX_DEVICES][32];
 };
@@ -553,54 +554,60 @@ static void db9_close(struct input_dev *dev)
        mutex_unlock(&db9->mutex);
 }
 
-static struct db9 __init *db9_probe(int parport, int mode)
+static void db9_attach(struct parport *pp)
 {
        struct db9 *db9;
        const struct db9_mode_data *db9_mode;
-       struct parport *pp;
        struct pardevice *pd;
        struct input_dev *input_dev;
        int i, j;
-       int err;
+       int mode;
+       struct pardev_cb db9_parport_cb;
+
+       for (i = 0; i < DB9_MAX_PORTS; i++) {
+               if (db9_cfg[i].nargs == 0 ||
+                   db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
+                       continue;
+
+               if (db9_cfg[i].args[DB9_ARG_PARPORT] == pp->number)
+                       break;
+       }
+
+       if (i == DB9_MAX_PORTS) {
+               pr_debug("Not using parport%d.\n", pp->number);
+               return;
+       }
+
+       mode = db9_cfg[i].args[DB9_ARG_MODE];
 
        if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) {
                printk(KERN_ERR "db9.c: Bad device type %d\n", mode);
-               err = -EINVAL;
-               goto err_out;
+               return;
        }
 
        db9_mode = &db9_modes[mode];
 
-       pp = parport_find_number(parport);
-       if (!pp) {
-               printk(KERN_ERR "db9.c: no such parport\n");
-               err = -ENODEV;
-               goto err_out;
-       }
-
        if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) {
                printk(KERN_ERR "db9.c: specified parport is not bidirectional\n");
-               err = -EINVAL;
-               goto err_put_pp;
+               return;
        }
 
-       pd = parport_register_device(pp, "db9", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+       db9_parport_cb.flags = PARPORT_FLAG_EXCL;
+
+       pd = parport_register_dev_model(pp, "db9", &db9_parport_cb, i);
        if (!pd) {
                printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n");
-               err = -EBUSY;
-               goto err_put_pp;
+               return;
        }
 
        db9 = kzalloc(sizeof(struct db9), GFP_KERNEL);
-       if (!db9) {
-               printk(KERN_ERR "db9.c: Not enough memory\n");
-               err = -ENOMEM;
+       if (!db9)
                goto err_unreg_pardev;
-       }
 
        mutex_init(&db9->mutex);
        db9->pd = pd;
        db9->mode = mode;
+       db9->parportno = pp->number;
        init_timer(&db9->timer);
        db9->timer.data = (long) db9;
        db9->timer.function = db9_timer;
@@ -610,7 +617,6 @@ static struct db9 __init *db9_probe(int parport, int mode)
                db9->dev[i] = input_dev = input_allocate_device();
                if (!input_dev) {
                        printk(KERN_ERR "db9.c: Not enough memory for input device\n");
-                       err = -ENOMEM;
                        goto err_unreg_devs;
                }
 
@@ -639,13 +645,12 @@ static struct db9 __init *db9_probe(int parport, int mode)
                                input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);
                }
 
-               err = input_register_device(input_dev);
-               if (err)
+               if (input_register_device(input_dev))
                        goto err_free_dev;
        }
 
-       parport_put_port(pp);
-       return db9;
+       db9_base[i] = db9;
+       return;
 
  err_free_dev:
        input_free_device(db9->dev[i]);
@@ -655,15 +660,22 @@ static struct db9 __init *db9_probe(int parport, int mode)
        kfree(db9);
  err_unreg_pardev:
        parport_unregister_device(pd);
- err_put_pp:
-       parport_put_port(pp);
- err_out:
-       return ERR_PTR(err);
 }
 
-static void db9_remove(struct db9 *db9)
+static void db9_detach(struct parport *port)
 {
        int i;
+       struct db9 *db9;
+
+       for (i = 0; i < DB9_MAX_PORTS; i++) {
+               if (db9_base[i] && db9_base[i]->parportno == port->number)
+                       break;
+       }
+
+       if (i == DB9_MAX_PORTS)
+               return;
+
+       db9 = db9_base[i];
 
        for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++)
                input_unregister_device(db9->dev[i]);
@@ -671,11 +683,17 @@ static void db9_remove(struct db9 *db9)
        kfree(db9);
 }
 
+static struct parport_driver db9_parport_driver = {
+       .name = "db9",
+       .match_port = db9_attach,
+       .detach = db9_detach,
+       .devmodel = true,
+};
+
 static int __init db9_init(void)
 {
        int i;
        int have_dev = 0;
-       int err = 0;
 
        for (i = 0; i < DB9_MAX_PORTS; i++) {
                if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
@@ -683,37 +701,21 @@ static int __init db9_init(void)
 
                if (db9_cfg[i].nargs < 2) {
                        printk(KERN_ERR "db9.c: Device type must be specified.\n");
-                       err = -EINVAL;
-                       break;
-               }
-
-               db9_base[i] = db9_probe(db9_cfg[i].args[DB9_ARG_PARPORT],
-                                       db9_cfg[i].args[DB9_ARG_MODE]);
-               if (IS_ERR(db9_base[i])) {
-                       err = PTR_ERR(db9_base[i]);
-                       break;
+                       return -EINVAL;
                }
 
                have_dev = 1;
        }
 
-       if (err) {
-               while (--i >= 0)
-                       if (db9_base[i])
-                               db9_remove(db9_base[i]);
-               return err;
-       }
+       if (!have_dev)
+               return -ENODEV;
 
-       return have_dev ? 0 : -ENODEV;
+       return parport_register_driver(&db9_parport_driver);
 }
 
 static void __exit db9_exit(void)
 {
-       int i;
-
-       for (i = 0; i < DB9_MAX_PORTS; i++)
-               if (db9_base[i])
-                       db9_remove(db9_base[i]);
+       parport_unregister_driver(&db9_parport_driver);
 }
 
 module_init(db9_init);
index e68e497..394ccbe 100644 (file)
@@ -53,7 +53,7 @@ struct gc_config {
        unsigned int nargs;
 };
 
-static struct gc_config gc_cfg[GC_MAX_PORTS] __initdata;
+static struct gc_config gc_cfg[GC_MAX_PORTS];
 
 module_param_array_named(map, gc_cfg[0].args, int, &gc_cfg[0].nargs, 0);
 MODULE_PARM_DESC(map, "Describes first set of devices (<parport#>,<pad1>,<pad2>,..<pad5>)");
@@ -92,6 +92,7 @@ struct gc {
        struct timer_list timer;
        int pad_count[GC_MAX];
        int used;
+       int parportno;
        struct mutex mutex;
 };
 
@@ -304,7 +305,7 @@ static int gc_n64_play_effect(struct input_dev *dev, void *data,
        return 0;
 }
 
-static int __init gc_n64_init_ff(struct input_dev *dev, int i)
+static int gc_n64_init_ff(struct input_dev *dev, int i)
 {
        struct gc_subdev *sdev;
        int err;
@@ -811,7 +812,7 @@ static void gc_close(struct input_dev *dev)
        mutex_unlock(&gc->mutex);
 }
 
-static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type)
+static int gc_setup_pad(struct gc *gc, int idx, int pad_type)
 {
        struct gc_pad *pad = &gc->pads[idx];
        struct input_dev *input_dev;
@@ -926,46 +927,54 @@ err_free_dev:
        return err;
 }
 
-static struct gc __init *gc_probe(int parport, int *pads, int n_pads)
+static void gc_attach(struct parport *pp)
 {
        struct gc *gc;
-       struct parport *pp;
        struct pardevice *pd;
        int i;
        int count = 0;
-       int err;
+       int *pads, n_pads;
+       struct pardev_cb gc_parport_cb;
+
+       for (i = 0; i < GC_MAX_PORTS; i++) {
+               if (gc_cfg[i].nargs == 0 || gc_cfg[i].args[0] < 0)
+                       continue;
+
+               if (gc_cfg[i].args[0] == pp->number)
+                       break;
+       }
 
-       pp = parport_find_number(parport);
-       if (!pp) {
-               pr_err("no such parport %d\n", parport);
-               err = -EINVAL;
-               goto err_out;
+       if (i == GC_MAX_PORTS) {
+               pr_debug("Not using parport%d.\n", pp->number);
+               return;
        }
+       pads = gc_cfg[i].args + 1;
+       n_pads = gc_cfg[i].nargs - 1;
+
+       gc_parport_cb.flags = PARPORT_FLAG_EXCL;
 
-       pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+       pd = parport_register_dev_model(pp, "gamecon", &gc_parport_cb, i);
        if (!pd) {
                pr_err("parport busy already - lp.o loaded?\n");
-               err = -EBUSY;
-               goto err_put_pp;
+               return;
        }
 
        gc = kzalloc(sizeof(struct gc), GFP_KERNEL);
        if (!gc) {
                pr_err("Not enough memory\n");
-               err = -ENOMEM;
                goto err_unreg_pardev;
        }
 
        mutex_init(&gc->mutex);
        gc->pd = pd;
+       gc->parportno = pp->number;
        setup_timer(&gc->timer, gc_timer, (long) gc);
 
        for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) {
                if (!pads[i])
                        continue;
 
-               err = gc_setup_pad(gc, i, pads[i]);
-               if (err)
+               if (gc_setup_pad(gc, i, pads[i]))
                        goto err_unreg_devs;
 
                count++;
@@ -973,12 +982,11 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads)
 
        if (count == 0) {
                pr_err("No valid devices specified\n");
-               err = -EINVAL;
                goto err_free_gc;
        }
 
-       parport_put_port(pp);
-       return gc;
+       gc_base[i] = gc;
+       return;
 
  err_unreg_devs:
        while (--i >= 0)
@@ -988,15 +996,23 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads)
        kfree(gc);
  err_unreg_pardev:
        parport_unregister_device(pd);
- err_put_pp:
-       parport_put_port(pp);
- err_out:
-       return ERR_PTR(err);
 }
 
-static void gc_remove(struct gc *gc)
+static void gc_detach(struct parport *port)
 {
        int i;
+       struct gc *gc;
+
+       for (i = 0; i < GC_MAX_PORTS; i++) {
+               if (gc_base[i] && gc_base[i]->parportno == port->number)
+                       break;
+       }
+
+       if (i == GC_MAX_PORTS)
+               return;
+
+       gc = gc_base[i];
+       gc_base[i] = NULL;
 
        for (i = 0; i < GC_MAX_DEVICES; i++)
                if (gc->pads[i].dev)
@@ -1005,11 +1021,17 @@ static void gc_remove(struct gc *gc)
        kfree(gc);
 }
 
+static struct parport_driver gc_parport_driver = {
+       .name = "gamecon",
+       .match_port = gc_attach,
+       .detach = gc_detach,
+       .devmodel = true,
+};
+
 static int __init gc_init(void)
 {
        int i;
        int have_dev = 0;
-       int err = 0;
 
        for (i = 0; i < GC_MAX_PORTS; i++) {
                if (gc_cfg[i].nargs == 0 || gc_cfg[i].args[0] < 0)
@@ -1017,37 +1039,21 @@ static int __init gc_init(void)
 
                if (gc_cfg[i].nargs < 2) {
                        pr_err("at least one device must be specified\n");
-                       err = -EINVAL;
-                       break;
-               }
-
-               gc_base[i] = gc_probe(gc_cfg[i].args[0],
-                                     gc_cfg[i].args + 1, gc_cfg[i].nargs - 1);
-               if (IS_ERR(gc_base[i])) {
-                       err = PTR_ERR(gc_base[i]);
-                       break;
+                       return -EINVAL;
                }
 
                have_dev = 1;
        }
 
-       if (err) {
-               while (--i >= 0)
-                       if (gc_base[i])
-                               gc_remove(gc_base[i]);
-               return err;
-       }
+       if (!have_dev)
+               return -ENODEV;
 
-       return have_dev ? 0 : -ENODEV;
+       return parport_register_driver(&gc_parport_driver);
 }
 
 static void __exit gc_exit(void)
 {
-       int i;
-
-       for (i = 0; i < GC_MAX_PORTS; i++)
-               if (gc_base[i])
-                       gc_remove(gc_base[i]);
+       parport_unregister_driver(&gc_parport_driver);
 }
 
 module_init(gc_init);
index 891797a..01e8ea9 100644 (file)
@@ -49,7 +49,7 @@ struct tgfx_config {
        unsigned int nargs;
 };
 
-static struct tgfx_config tgfx_cfg[TGFX_MAX_PORTS] __initdata;
+static struct tgfx_config tgfx_cfg[TGFX_MAX_PORTS];
 
 module_param_array_named(map, tgfx_cfg[0].args, int, &tgfx_cfg[0].nargs, 0);
 MODULE_PARM_DESC(map, "Describes first set of devices (<parport#>,<js1>,<js2>,..<js7>");
@@ -81,6 +81,7 @@ static struct tgfx {
        char phys[TGFX_MAX_DEVICES][32];
        int sticks;
        int used;
+       int parportno;
        struct mutex sem;
 } *tgfx_base[TGFX_MAX_PORTS];
 
@@ -156,38 +157,46 @@ static void tgfx_close(struct input_dev *dev)
  * tgfx_probe() probes for tg gamepads.
  */
 
-static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
+static void tgfx_attach(struct parport *pp)
 {
        struct tgfx *tgfx;
        struct input_dev *input_dev;
-       struct parport *pp;
        struct pardevice *pd;
        int i, j;
-       int err;
+       int *n_buttons, n_devs;
+       struct pardev_cb tgfx_parport_cb;
+
+       for (i = 0; i < TGFX_MAX_PORTS; i++) {
+               if (tgfx_cfg[i].nargs == 0 || tgfx_cfg[i].args[0] < 0)
+                       continue;
+               if (tgfx_cfg[i].args[0] == pp->number)
+                       break;
+       }
 
-       pp = parport_find_number(parport);
-       if (!pp) {
-               printk(KERN_ERR "turbografx.c: no such parport\n");
-               err = -EINVAL;
-               goto err_out;
+       if (i == TGFX_MAX_PORTS) {
+               pr_debug("Not using parport%d.\n", pp->number);
+               return;
        }
+       n_buttons = tgfx_cfg[i].args + 1;
+       n_devs = tgfx_cfg[i].nargs - 1;
 
-       pd = parport_register_device(pp, "turbografx", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+       tgfx_parport_cb.flags = PARPORT_FLAG_EXCL;
+
+       pd = parport_register_dev_model(pp, "turbografx", &tgfx_parport_cb, i);
        if (!pd) {
-               printk(KERN_ERR "turbografx.c: parport busy already - lp.o loaded?\n");
-               err = -EBUSY;
-               goto err_put_pp;
+               pr_err("parport busy already - lp.o loaded?\n");
+               return;
        }
 
        tgfx = kzalloc(sizeof(struct tgfx), GFP_KERNEL);
        if (!tgfx) {
                printk(KERN_ERR "turbografx.c: Not enough memory\n");
-               err = -ENOMEM;
                goto err_unreg_pardev;
        }
 
        mutex_init(&tgfx->sem);
        tgfx->pd = pd;
+       tgfx->parportno = pp->number;
        init_timer(&tgfx->timer);
        tgfx->timer.data = (long) tgfx;
        tgfx->timer.function = tgfx_timer;
@@ -198,14 +207,12 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
 
                if (n_buttons[i] > ARRAY_SIZE(tgfx_buttons)) {
                        printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]);
-                       err = -EINVAL;
                        goto err_unreg_devs;
                }
 
                tgfx->dev[i] = input_dev = input_allocate_device();
                if (!input_dev) {
                        printk(KERN_ERR "turbografx.c: Not enough memory for input device\n");
-                       err = -ENOMEM;
                        goto err_unreg_devs;
                }
 
@@ -234,19 +241,17 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
                for (j = 0; j < n_buttons[i]; j++)
                        set_bit(tgfx_buttons[j], input_dev->keybit);
 
-               err = input_register_device(tgfx->dev[i]);
-               if (err)
+               if (input_register_device(tgfx->dev[i]))
                        goto err_free_dev;
        }
 
         if (!tgfx->sticks) {
                printk(KERN_ERR "turbografx.c: No valid devices specified\n");
-               err = -EINVAL;
                goto err_free_tgfx;
         }
 
-       parport_put_port(pp);
-       return tgfx;
+       tgfx_base[i] = tgfx;
+       return;
 
  err_free_dev:
        input_free_device(tgfx->dev[i]);
@@ -258,15 +263,23 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
        kfree(tgfx);
  err_unreg_pardev:
        parport_unregister_device(pd);
- err_put_pp:
-       parport_put_port(pp);
- err_out:
-       return ERR_PTR(err);
 }
 
-static void tgfx_remove(struct tgfx *tgfx)
+static void tgfx_detach(struct parport *port)
 {
        int i;
+       struct tgfx *tgfx;
+
+       for (i = 0; i < TGFX_MAX_PORTS; i++) {
+               if (tgfx_base[i] && tgfx_base[i]->parportno == port->number)
+                       break;
+       }
+
+       if (i == TGFX_MAX_PORTS)
+               return;
+
+       tgfx = tgfx_base[i];
+       tgfx_base[i] = NULL;
 
        for (i = 0; i < TGFX_MAX_DEVICES; i++)
                if (tgfx->dev[i])
@@ -275,11 +288,17 @@ static void tgfx_remove(struct tgfx *tgfx)
        kfree(tgfx);
 }
 
+static struct parport_driver tgfx_parport_driver = {
+       .name = "turbografx",
+       .match_port = tgfx_attach,
+       .detach = tgfx_detach,
+       .devmodel = true,
+};
+
 static int __init tgfx_init(void)
 {
        int i;
        int have_dev = 0;
-       int err = 0;
 
        for (i = 0; i < TGFX_MAX_PORTS; i++) {
                if (tgfx_cfg[i].nargs == 0 || tgfx_cfg[i].args[0] < 0)
@@ -287,38 +306,21 @@ static int __init tgfx_init(void)
 
                if (tgfx_cfg[i].nargs < 2) {
                        printk(KERN_ERR "turbografx.c: at least one joystick must be specified\n");
-                       err = -EINVAL;
-                       break;
-               }
-
-               tgfx_base[i] = tgfx_probe(tgfx_cfg[i].args[0],
-                                         tgfx_cfg[i].args + 1,
-                                         tgfx_cfg[i].nargs - 1);
-               if (IS_ERR(tgfx_base[i])) {
-                       err = PTR_ERR(tgfx_base[i]);
-                       break;
+                       return -EINVAL;
                }
 
                have_dev = 1;
        }
 
-       if (err) {
-               while (--i >= 0)
-                       if (tgfx_base[i])
-                               tgfx_remove(tgfx_base[i]);
-               return err;
-       }
+       if (!have_dev)
+               return -ENODEV;
 
-       return have_dev ? 0 : -ENODEV;
+       return parport_register_driver(&tgfx_parport_driver);
 }
 
 static void __exit tgfx_exit(void)
 {
-       int i;
-
-       for (i = 0; i < TGFX_MAX_PORTS; i++)
-               if (tgfx_base[i])
-                       tgfx_remove(tgfx_base[i]);
+       parport_unregister_driver(&tgfx_parport_driver);
 }
 
 module_init(tgfx_init);
index b76ac58..9c07fe9 100644 (file)
@@ -200,35 +200,38 @@ static void walkera0701_close(struct input_dev *dev)
        parport_release(w->pardevice);
 }
 
-static int walkera0701_connect(struct walkera_dev *w, int parport)
+static void walkera0701_attach(struct parport *pp)
 {
-       int error;
+       struct pardev_cb walkera0701_parport_cb;
+       struct walkera_dev *w = &w_dev;
 
-       w->parport = parport_find_number(parport);
-       if (!w->parport) {
-               pr_err("parport %d does not exist\n", parport);
-               return -ENODEV;
+       if (pp->number != walkera0701_pp_no) {
+               pr_debug("Not using parport%d.\n", pp->number);
+               return;
        }
 
-       if (w->parport->irq == -1) {
+       if (pp->irq == -1) {
                pr_err("parport %d does not have interrupt assigned\n",
-                       parport);
-               error = -EINVAL;
-               goto err_put_parport;
+                       pp->number);
+               return;
        }
 
-       w->pardevice = parport_register_device(w->parport, "walkera0701",
-                                   NULL, NULL, walkera0701_irq_handler,
-                                   PARPORT_DEV_EXCL, w);
+       w->parport = pp;
+
+       walkera0701_parport_cb.flags = PARPORT_FLAG_EXCL;
+       walkera0701_parport_cb.irq_func = walkera0701_irq_handler;
+       walkera0701_parport_cb.private = w;
+
+       w->pardevice = parport_register_dev_model(pp, "walkera0701",
+                                                 &walkera0701_parport_cb, 0);
+
        if (!w->pardevice) {
                pr_err("failed to register parport device\n");
-               error = -EIO;
-               goto err_put_parport;
+               return;
        }
 
        if (parport_negotiate(w->pardevice->port, IEEE1284_MODE_COMPAT)) {
                pr_err("failed to negotiate parport mode\n");
-               error = -EIO;
                goto err_unregister_device;
        }
 
@@ -238,7 +241,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
        w->input_dev = input_allocate_device();
        if (!w->input_dev) {
                pr_err("failed to allocate input device\n");
-               error = -ENOMEM;
                goto err_unregister_device;
        }
 
@@ -265,38 +267,46 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
        input_set_abs_params(w->input_dev, ABS_RUDDER, -512, 512, 0, 0);
        input_set_abs_params(w->input_dev, ABS_MISC, -512, 512, 0, 0);
 
-       error = input_register_device(w->input_dev);
-       if (error) {
+       if (input_register_device(w->input_dev)) {
                pr_err("failed to register input device\n");
                goto err_free_input_dev;
        }
 
-       return 0;
+       return;
 
 err_free_input_dev:
        input_free_device(w->input_dev);
 err_unregister_device:
        parport_unregister_device(w->pardevice);
-err_put_parport:
-       parport_put_port(w->parport);
-       return error;
 }
 
-static void walkera0701_disconnect(struct walkera_dev *w)
+static void walkera0701_detach(struct parport *port)
 {
+       struct walkera_dev *w = &w_dev;
+
+       if (!w->pardevice || w->parport->number != port->number)
+               return;
+
        input_unregister_device(w->input_dev);
        parport_unregister_device(w->pardevice);
-       parport_put_port(w->parport);
+       w->parport = NULL;
 }
 
+static struct parport_driver walkera0701_parport_driver = {
+       .name = "walkera0701",
+       .match_port = walkera0701_attach,
+       .detach = walkera0701_detach,
+       .devmodel = true,
+};
+
 static int __init walkera0701_init(void)
 {
-       return walkera0701_connect(&w_dev, walkera0701_pp_no);
+       return parport_register_driver(&walkera0701_parport_driver);
 }
 
 static void __exit walkera0701_exit(void)
 {
-       walkera0701_disconnect(&w_dev);
+       parport_unregister_driver(&walkera0701_parport_driver);
 }
 
 module_init(walkera0701_init);
index b052afe..6639b2b 100644 (file)
@@ -266,7 +266,7 @@ static int omap4_keypad_probe(struct platform_device *pdev)
 
        error = omap4_keypad_parse_dt(&pdev->dev, keypad_data);
        if (error)
-               return error;
+               goto err_free_keypad;
 
        res = request_mem_region(res->start, resource_size(res), pdev->name);
        if (!res) {
index 189bdc8..2f04773 100644 (file)
@@ -85,15 +85,6 @@ static int ad714x_i2c_probe(struct i2c_client *client,
        return 0;
 }
 
-static int ad714x_i2c_remove(struct i2c_client *client)
-{
-       struct ad714x_chip *chip = i2c_get_clientdata(client);
-
-       ad714x_remove(chip);
-
-       return 0;
-}
-
 static const struct i2c_device_id ad714x_id[] = {
        { "ad7142_captouch", 0 },
        { "ad7143_captouch", 0 },
@@ -110,7 +101,6 @@ static struct i2c_driver ad714x_i2c_driver = {
                .pm   = &ad714x_i2c_pm,
        },
        .probe    = ad714x_i2c_probe,
-       .remove   = ad714x_i2c_remove,
        .id_table = ad714x_id,
 };
 
index a79e50b..c8170f0 100644 (file)
@@ -101,15 +101,6 @@ static int ad714x_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int ad714x_spi_remove(struct spi_device *spi)
-{
-       struct ad714x_chip *chip = spi_get_drvdata(spi);
-
-       ad714x_remove(chip);
-
-       return 0;
-}
-
 static struct spi_driver ad714x_spi_driver = {
        .driver = {
                .name   = "ad714x_captouch",
@@ -117,7 +108,6 @@ static struct spi_driver ad714x_spi_driver = {
                .pm     = &ad714x_spi_pm,
        },
        .probe          = ad714x_spi_probe,
-       .remove         = ad714x_spi_remove,
 };
 
 module_spi_driver(ad714x_spi_driver);
index 7a61e9e..84b51dd 100644 (file)
@@ -960,13 +960,12 @@ static irqreturn_t ad714x_interrupt_thread(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-#define MAX_DEVICE_NUM 8
 struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
                                 ad714x_read_t read, ad714x_write_t write)
 {
-       int i, alloc_idx;
+       int i;
        int error;
-       struct input_dev *input[MAX_DEVICE_NUM];
+       struct input_dev *input;
 
        struct ad714x_platform_data *plat_data = dev_get_platdata(dev);
        struct ad714x_chip *ad714x;
@@ -982,25 +981,25 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
        if (irq <= 0) {
                dev_err(dev, "IRQ not configured!\n");
                error = -EINVAL;
-               goto err_out;
+               return ERR_PTR(error);
        }
 
        if (dev_get_platdata(dev) == NULL) {
                dev_err(dev, "platform data for ad714x doesn't exist\n");
                error = -EINVAL;
-               goto err_out;
+               return ERR_PTR(error);
        }
 
-       ad714x = kzalloc(sizeof(*ad714x) + sizeof(*ad714x->sw) +
-                        sizeof(*sd_drv) * plat_data->slider_num +
-                        sizeof(*wl_drv) * plat_data->wheel_num +
-                        sizeof(*tp_drv) * plat_data->touchpad_num +
-                        sizeof(*bt_drv) * plat_data->button_num, GFP_KERNEL);
+       ad714x = devm_kzalloc(dev, sizeof(*ad714x) + sizeof(*ad714x->sw) +
+                                  sizeof(*sd_drv) * plat_data->slider_num +
+                                  sizeof(*wl_drv) * plat_data->wheel_num +
+                                  sizeof(*tp_drv) * plat_data->touchpad_num +
+                                  sizeof(*bt_drv) * plat_data->button_num,
+                             GFP_KERNEL);
        if (!ad714x) {
                error = -ENOMEM;
-               goto err_out;
+               return ERR_PTR(error);
        }
-
        ad714x->hw = plat_data;
 
        drv_mem = ad714x + 1;
@@ -1022,47 +1021,40 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
 
        error = ad714x_hw_detect(ad714x);
        if (error)
-               goto err_free_mem;
+               return ERR_PTR(error);
 
        /* initialize and request sw/hw resources */
 
        ad714x_hw_init(ad714x);
        mutex_init(&ad714x->mutex);
 
-       /*
-        * Allocate and register AD714X input device
-        */
-       alloc_idx = 0;
-
        /* a slider uses one input_dev instance */
        if (ad714x->hw->slider_num > 0) {
                struct ad714x_slider_plat *sd_plat = ad714x->hw->slider;
 
                for (i = 0; i < ad714x->hw->slider_num; i++) {
-                       sd_drv[i].input = input[alloc_idx] = input_allocate_device();
-                       if (!input[alloc_idx]) {
-                               error = -ENOMEM;
-                               goto err_free_dev;
-                       }
-
-                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
-                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
-                       __set_bit(ABS_X, input[alloc_idx]->absbit);
-                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
-                       input_set_abs_params(input[alloc_idx],
+                       input = devm_input_allocate_device(dev);
+                       if (!input)
+                               return ERR_PTR(-ENOMEM);
+
+                       __set_bit(EV_ABS, input->evbit);
+                       __set_bit(EV_KEY, input->evbit);
+                       __set_bit(ABS_X, input->absbit);
+                       __set_bit(BTN_TOUCH, input->keybit);
+                       input_set_abs_params(input,
                                ABS_X, 0, sd_plat->max_coord, 0, 0);
 
-                       input[alloc_idx]->id.bustype = bus_type;
-                       input[alloc_idx]->id.product = ad714x->product;
-                       input[alloc_idx]->id.version = ad714x->version;
-                       input[alloc_idx]->name = "ad714x_captouch_slider";
-                       input[alloc_idx]->dev.parent = dev;
+                       input->id.bustype = bus_type;
+                       input->id.product = ad714x->product;
+                       input->id.version = ad714x->version;
+                       input->name = "ad714x_captouch_slider";
+                       input->dev.parent = dev;
 
-                       error = input_register_device(input[alloc_idx]);
+                       error = input_register_device(input);
                        if (error)
-                               goto err_free_dev;
+                               return ERR_PTR(error);
 
-                       alloc_idx++;
+                       sd_drv[i].input = input;
                }
        }
 
@@ -1071,30 +1063,28 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
                struct ad714x_wheel_plat *wl_plat = ad714x->hw->wheel;
 
                for (i = 0; i < ad714x->hw->wheel_num; i++) {
-                       wl_drv[i].input = input[alloc_idx] = input_allocate_device();
-                       if (!input[alloc_idx]) {
-                               error = -ENOMEM;
-                               goto err_free_dev;
-                       }
-
-                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
-                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
-                       __set_bit(ABS_WHEEL, input[alloc_idx]->absbit);
-                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
-                       input_set_abs_params(input[alloc_idx],
+                       input = devm_input_allocate_device(dev);
+                       if (!input)
+                               return ERR_PTR(-ENOMEM);
+
+                       __set_bit(EV_KEY, input->evbit);
+                       __set_bit(EV_ABS, input->evbit);
+                       __set_bit(ABS_WHEEL, input->absbit);
+                       __set_bit(BTN_TOUCH, input->keybit);
+                       input_set_abs_params(input,
                                ABS_WHEEL, 0, wl_plat->max_coord, 0, 0);
 
-                       input[alloc_idx]->id.bustype = bus_type;
-                       input[alloc_idx]->id.product = ad714x->product;
-                       input[alloc_idx]->id.version = ad714x->version;
-                       input[alloc_idx]->name = "ad714x_captouch_wheel";
-                       input[alloc_idx]->dev.parent = dev;
+                       input->id.bustype = bus_type;
+                       input->id.product = ad714x->product;
+                       input->id.version = ad714x->version;
+                       input->name = "ad714x_captouch_wheel";
+                       input->dev.parent = dev;
 
-                       error = input_register_device(input[alloc_idx]);
+                       error = input_register_device(input);
                        if (error)
-                               goto err_free_dev;
+                               return ERR_PTR(error);
 
-                       alloc_idx++;
+                       wl_drv[i].input = input;
                }
        }
 
@@ -1103,33 +1093,31 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
                struct ad714x_touchpad_plat *tp_plat = ad714x->hw->touchpad;
 
                for (i = 0; i < ad714x->hw->touchpad_num; i++) {
-                       tp_drv[i].input = input[alloc_idx] = input_allocate_device();
-                       if (!input[alloc_idx]) {
-                               error = -ENOMEM;
-                               goto err_free_dev;
-                       }
-
-                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
-                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
-                       __set_bit(ABS_X, input[alloc_idx]->absbit);
-                       __set_bit(ABS_Y, input[alloc_idx]->absbit);
-                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
-                       input_set_abs_params(input[alloc_idx],
+                       input = devm_input_allocate_device(dev);
+                       if (!input)
+                               return ERR_PTR(-ENOMEM);
+
+                       __set_bit(EV_ABS, input->evbit);
+                       __set_bit(EV_KEY, input->evbit);
+                       __set_bit(ABS_X, input->absbit);
+                       __set_bit(ABS_Y, input->absbit);
+                       __set_bit(BTN_TOUCH, input->keybit);
+                       input_set_abs_params(input,
                                ABS_X, 0, tp_plat->x_max_coord, 0, 0);
-                       input_set_abs_params(input[alloc_idx],
+                       input_set_abs_params(input,
                                ABS_Y, 0, tp_plat->y_max_coord, 0, 0);
 
-                       input[alloc_idx]->id.bustype = bus_type;
-                       input[alloc_idx]->id.product = ad714x->product;
-                       input[alloc_idx]->id.version = ad714x->version;
-                       input[alloc_idx]->name = "ad714x_captouch_pad";
-                       input[alloc_idx]->dev.parent = dev;
+                       input->id.bustype = bus_type;
+                       input->id.product = ad714x->product;
+                       input->id.version = ad714x->version;
+                       input->name = "ad714x_captouch_pad";
+                       input->dev.parent = dev;
 
-                       error = input_register_device(input[alloc_idx]);
+                       error = input_register_device(input);
                        if (error)
-                               goto err_free_dev;
+                               return ERR_PTR(error);
 
-                       alloc_idx++;
+                       tp_drv[i].input = input;
                }
        }
 
@@ -1137,82 +1125,44 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
        if (ad714x->hw->button_num > 0) {
                struct ad714x_button_plat *bt_plat = ad714x->hw->button;
 
-               input[alloc_idx] = input_allocate_device();
-               if (!input[alloc_idx]) {
+               input = devm_input_allocate_device(dev);
+               if (!input) {
                        error = -ENOMEM;
-                       goto err_free_dev;
+                       return ERR_PTR(error);
                }
 
-               __set_bit(EV_KEY, input[alloc_idx]->evbit);
+               __set_bit(EV_KEY, input->evbit);
                for (i = 0; i < ad714x->hw->button_num; i++) {
-                       bt_drv[i].input = input[alloc_idx];
-                       __set_bit(bt_plat[i].keycode, input[alloc_idx]->keybit);
+                       bt_drv[i].input = input;
+                       __set_bit(bt_plat[i].keycode, input->keybit);
                }
 
-               input[alloc_idx]->id.bustype = bus_type;
-               input[alloc_idx]->id.product = ad714x->product;
-               input[alloc_idx]->id.version = ad714x->version;
-               input[alloc_idx]->name = "ad714x_captouch_button";
-               input[alloc_idx]->dev.parent = dev;
+               input->id.bustype = bus_type;
+               input->id.product = ad714x->product;
+               input->id.version = ad714x->version;
+               input->name = "ad714x_captouch_button";
+               input->dev.parent = dev;
 
-               error = input_register_device(input[alloc_idx]);
+               error = input_register_device(input);
                if (error)
-                       goto err_free_dev;
-
-               alloc_idx++;
+                       return ERR_PTR(error);
        }
 
        irqflags = plat_data->irqflags ?: IRQF_TRIGGER_FALLING;
        irqflags |= IRQF_ONESHOT;
 
-       error = request_threaded_irq(ad714x->irq, NULL, ad714x_interrupt_thread,
-                                    irqflags, "ad714x_captouch", ad714x);
+       error = devm_request_threaded_irq(dev, ad714x->irq, NULL,
+                                         ad714x_interrupt_thread,
+                                         irqflags, "ad714x_captouch", ad714x);
        if (error) {
                dev_err(dev, "can't allocate irq %d\n", ad714x->irq);
-               goto err_unreg_dev;
+               return ERR_PTR(error);
        }
 
        return ad714x;
-
- err_free_dev:
-       dev_err(dev, "failed to setup AD714x input device %i\n", alloc_idx);
-       input_free_device(input[alloc_idx]);
- err_unreg_dev:
-       while (--alloc_idx >= 0)
-               input_unregister_device(input[alloc_idx]);
- err_free_mem:
-       kfree(ad714x);
- err_out:
-       return ERR_PTR(error);
 }
 EXPORT_SYMBOL(ad714x_probe);
 
-void ad714x_remove(struct ad714x_chip *ad714x)
-{
-       struct ad714x_platform_data *hw = ad714x->hw;
-       struct ad714x_driver_data *sw = ad714x->sw;
-       int i;
-
-       free_irq(ad714x->irq, ad714x);
-
-       /* unregister and free all input devices */
-
-       for (i = 0; i < hw->slider_num; i++)
-               input_unregister_device(sw->slider[i].input);
-
-       for (i = 0; i < hw->wheel_num; i++)
-               input_unregister_device(sw->wheel[i].input);
-
-       for (i = 0; i < hw->touchpad_num; i++)
-               input_unregister_device(sw->touchpad[i].input);
-
-       if (hw->button_num)
-               input_unregister_device(sw->button[0].input);
-
-       kfree(ad714x);
-}
-EXPORT_SYMBOL(ad714x_remove);
-
 #ifdef CONFIG_PM
 int ad714x_disable(struct ad714x_chip *ad714x)
 {
index 3c85455..5d65d30 100644 (file)
@@ -50,6 +50,5 @@ int ad714x_disable(struct ad714x_chip *ad714x);
 int ad714x_enable(struct ad714x_chip *ad714x);
 struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
                                 ad714x_read_t read, ad714x_write_t write);
-void ad714x_remove(struct ad714x_chip *ad714x);
 
 #endif
index 48de1e8..7239c31 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <linux/module.h>
 #include <linux/ratelimit.h>
+#include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/input.h>
 #include <linux/i2c.h>
 #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>
 
 #define MAX_SUPPORT_POINTS             5
 
@@ -91,9 +90,8 @@ 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;
 
 #if defined(CONFIG_DEBUG_FS)
        struct dentry *debug_dir;
@@ -752,45 +750,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)
@@ -850,44 +809,24 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
        return 0;
 }
 
-#define EDT_ATTR_CHECKSET(name, reg) \
-do {                                                           \
-       if (pdata->name >= edt_ft5x06_attr_##name.limit_low &&          \
-           pdata->name <= edt_ft5x06_attr_##name.limit_high)           \
-               edt_ft5x06_register_write(tsdata, reg, pdata->name);    \
-} while (0)
-
-#define EDT_GET_PROP(name, reg) {                              \
-       u32 val;                                                \
-       if (of_property_read_u32(np, #name, &val) == 0)         \
-               edt_ft5x06_register_write(tsdata, reg, val);    \
-}
-
-static void edt_ft5x06_ts_get_dt_defaults(struct device_node *np,
-                                       struct edt_ft5x06_ts_data *tsdata)
+static void edt_ft5x06_ts_get_defaults(struct device *dev,
+                                      struct edt_ft5x06_ts_data *tsdata)
 {
        struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
+       u32 val;
+       int error;
 
-       EDT_GET_PROP(threshold, reg_addr->reg_threshold);
-       EDT_GET_PROP(gain, reg_addr->reg_gain);
-       EDT_GET_PROP(offset, reg_addr->reg_offset);
-}
-
-static void
-edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,
-                          const struct edt_ft5x06_platform_data *pdata)
-{
-       struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
+       error = device_property_read_u32(dev, "threshold", &val);
+       if (!error)
+               reg_addr->reg_threshold = val;
 
-       if (!pdata->use_parameters)
-               return;
+       error = device_property_read_u32(dev, "gain", &val);
+       if (!error)
+               reg_addr->reg_gain = val;
 
-       /* pick up defaults from the platform data */
-       EDT_ATTR_CHECKSET(threshold, reg_addr->reg_threshold);
-       EDT_ATTR_CHECKSET(gain, reg_addr->reg_gain);
-       EDT_ATTR_CHECKSET(offset, reg_addr->reg_offset);
-       if (reg_addr->reg_report_rate != NO_REGISTER)
-               EDT_ATTR_CHECKSET(report_rate, reg_addr->reg_report_rate);
+       error = device_property_read_u32(dev, "offset", &val);
+       if (!error)
+               reg_addr->reg_offset = val;
 }
 
 static void
@@ -931,37 +870,12 @@ 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)
 {
-       const struct edt_ft5x06_platform_data *pdata =
-                                               dev_get_platdata(&client->dev);
        struct edt_ft5x06_ts_data *tsdata;
        struct input_dev *input;
+       unsigned long irq_flags;
        int error;
        char fw_version[EDT_NAME_LEN];
 
@@ -973,32 +887,33 @@ 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;
-               }
+       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);
@@ -1019,12 +934,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
        }
 
        edt_ft5x06_ts_set_regs(tsdata);
-
-       if (!pdata)
-               edt_ft5x06_ts_get_dt_defaults(client->dev.of_node, tsdata);
-       else
-               edt_ft5x06_ts_get_defaults(tsdata, pdata);
-
+       edt_ft5x06_ts_get_defaults(&client->dev, tsdata);
        edt_ft5x06_ts_get_parameters(tsdata);
 
        dev_dbg(&client->dev,
@@ -1040,8 +950,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
        input_set_abs_params(input, ABS_MT_POSITION_Y,
                             0, tsdata->num_y * 64 - 1, 0, 0);
 
-       if (!pdata)
-               touchscreen_parse_properties(input, true);
+       touchscreen_parse_properties(input, true);
 
        error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, INPUT_MT_DIRECT);
        if (error) {
@@ -1052,9 +961,13 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
        input_set_drvdata(input, tsdata);
        i2c_set_clientdata(client, tsdata);
 
-       error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
-                                       edt_ft5x06_ts_isr,
-                                       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+       irq_flags = irq_get_trigger_type(client->irq);
+       if (irq_flags == IRQF_TRIGGER_NONE)
+               irq_flags = IRQF_TRIGGER_FALLING;
+       irq_flags |= IRQF_ONESHOT;
+
+       error = devm_request_threaded_irq(&client->dev, client->irq,
+                                       NULL, edt_ft5x06_ts_isr, irq_flags,
                                        client->name, tsdata);
        if (error) {
                dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
@@ -1074,7 +987,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;
 
diff --git a/include/linux/input/edt-ft5x06.h b/include/linux/input/edt-ft5x06.h
deleted file mode 100644 (file)
index 8a1e0d1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _EDT_FT5X06_H
-#define _EDT_FT5X06_H
-
-/*
- * Copyright (c) 2012 Simon Budig, <simon.budig@kernelconcepts.de>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- */
-
-struct edt_ft5x06_platform_data {
-       int irq_pin;
-       int reset_pin;
-
-       /* startup defaults for operational parameters */
-       bool use_parameters;
-       u8 gain;
-       u8 threshold;
-       u8 offset;
-       u8 report_rate;
-};
-
-#endif /* _EDT_FT5X06_H */