This driver hardcodes gpio numbers without a header file.
Use lookup tables instead.

Cc: Marek Vasut <marek.va...@gmail.com>
Cc: Dmitry Torokhov <dmitry.torok...@gmail.com>
Cc: linux-in...@vger.kernel.org
Signed-off-by: Arnd Bergmann <a...@arndb.de>
---
 arch/arm/mach-pxa/mainstone.c                |  9 +++++
 arch/arm/mach-pxa/palmld.c                   |  9 +++++
 arch/arm/mach-pxa/palmt5.c                   |  9 +++++
 arch/arm/mach-pxa/palmtx.c                   |  9 +++++
 drivers/input/touchscreen/mainstone-wm97xx.c | 35 ++++++++------------
 5 files changed, 50 insertions(+), 21 deletions(-)

diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
index 5f7bc5a9215e..48b89bca7b46 100644
--- a/arch/arm/mach-pxa/mainstone.c
+++ b/arch/arm/mach-pxa/mainstone.c
@@ -545,6 +545,14 @@ static struct gpiod_lookup_table 
mainstone_pcmcia_gpio_table = {
        },
 };
 
+static struct gpiod_lookup_table mainstone_wm97xx_gpio_table = {
+       .dev_id = "wm97xx-touch",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", 4, "touch", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void __init mainstone_init(void)
 {
        int SW7 = 0;  /* FIXME: get from SCR (Mst doc section 3.2.1.1) */
@@ -559,6 +567,7 @@ static void __init mainstone_init(void)
                      "mst-pcmcia1", MST_PCMCIA_INPUTS, 0, NULL,
                      NULL, mst_pcmcia1_irqs);
        gpiod_add_lookup_table(&mainstone_pcmcia_gpio_table);
+       gpiod_add_lookup_table(&mainstone_wm97xx_gpio_table);
 
        pxa_set_ffuart_info(NULL);
        pxa_set_btuart_info(NULL);
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c
index d821606ce0b5..32308c63884e 100644
--- a/arch/arm/mach-pxa/palmld.c
+++ b/arch/arm/mach-pxa/palmld.c
@@ -347,6 +347,14 @@ static struct gpiod_lookup_table palmld_mci_gpio_table = {
        },
 };
 
+static struct gpiod_lookup_table palmld_wm97xx_touch_gpio_table = {
+       .dev_id = "wm97xx-touch",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void __init palmld_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
@@ -355,6 +363,7 @@ static void __init palmld_init(void)
        pxa_set_stuart_info(NULL);
 
        palm27x_mmc_init(&palmld_mci_gpio_table);
+       gpiod_add_lookup_table(&palmld_wm97xx_touch_gpio_table);
        palm27x_pm_init(PALMLD_STR_BASE);
        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
        palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE);
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c
index 4e2cff87deba..f21cb23c51ac 100644
--- a/arch/arm/mach-pxa/palmt5.c
+++ b/arch/arm/mach-pxa/palmt5.c
@@ -191,6 +191,14 @@ static struct gpiod_lookup_table palmt5_mci_gpio_table = {
        },
 };
 
+static struct gpiod_lookup_table palmt5_wm97xx_touch_gpio_table = {
+       .dev_id = "wm97xx-touch",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void __init palmt5_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
@@ -199,6 +207,7 @@ static void __init palmt5_init(void)
        pxa_set_stuart_info(NULL);
 
        palm27x_mmc_init(&palmt5_mci_gpio_table);
+       gpiod_add_lookup_table(&palmt5_wm97xx_touch_gpio_table);
        palm27x_pm_init(PALMT5_STR_BASE);
        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
        palm27x_udc_init(GPIO_NR_PALMT5_USB_DETECT_N,
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index d6819413a8d6..e0d9f7882285 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -346,6 +346,14 @@ static struct gpiod_lookup_table palmtx_mci_gpio_table = {
        },
 };
 
+static struct gpiod_lookup_table palmtx_wm97xx_touch_gpio_table = {
+       .dev_id = "wm97xx-touch",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void __init palmtx_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
@@ -354,6 +362,7 @@ static void __init palmtx_init(void)
        pxa_set_stuart_info(NULL);
 
        palm27x_mmc_init(&palmtx_mci_gpio_table);
+       gpiod_add_lookup_table(&palmtx_wm97xx_touch_gpio_table);
        palm27x_pm_init(PALMTX_STR_BASE);
        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
        palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c 
b/drivers/input/touchscreen/mainstone-wm97xx.c
index f8564b398eb3..87655105ef3a 100644
--- a/drivers/input/touchscreen/mainstone-wm97xx.c
+++ b/drivers/input/touchscreen/mainstone-wm97xx.c
@@ -21,6 +21,7 @@
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
+#include <linux/gpio/consumer.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/wm97xx.h>
@@ -58,7 +59,7 @@ static const struct continuous cinfo[] = {
 /* continuous speed index */
 static int sp_idx;
 static u16 last, tries;
-static int irq;
+static struct gpio_desc *gpiod_irq;
 
 /*
  * Pen sampling frequency (Hz) in continuous mode.
@@ -194,28 +195,21 @@ static int wm97xx_acc_startup(struct wm97xx *wm)
        /* IRQ driven touchscreen is used on Palm hardware */
        if (machine_is_palmt5() || machine_is_palmtx() || machine_is_palmld()) {
                pen_int = 1;
-               irq = 27;
                /* There is some obscure mutant of WM9712 interbred with WM9713
                 * used on Palm HW */
                wm->variant = WM97xx_WM1613;
-       } else if (machine_is_mainstone() && pen_int)
-               irq = 4;
-
-       if (irq) {
-               ret = gpio_request(irq, "Touchscreen IRQ");
-               if (ret)
-                       goto out;
-
-               ret = gpio_direction_input(irq);
-               if (ret) {
-                       gpio_free(irq);
-                       goto out;
-               }
+       }
+
+       if (pen_int) {
+               gpiod_irq = gpiod_get(wm->dev, "touch", GPIOD_IN);
+               if (IS_ERR(gpiod_irq))
+                       pen_int = 0;
+       }
 
-               wm->pen_irq = gpio_to_irq(irq);
+       if (pen_int) {
+               wm->pen_irq = gpiod_to_irq(gpiod_irq);
                irq_set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH);
-       } else /* pen irq not supported */
-               pen_int = 0;
+       }
 
        /* codec specific irq config */
        if (pen_int) {
@@ -242,7 +236,6 @@ static int wm97xx_acc_startup(struct wm97xx *wm)
                }
        }
 
-out:
        return ret;
 }
 
@@ -250,8 +243,8 @@ static void wm97xx_acc_shutdown(struct wm97xx *wm)
 {
        /* codec specific deconfig */
        if (pen_int) {
-               if (irq)
-                       gpio_free(irq);
+               if (gpiod_irq)
+                       gpiod_put(gpiod_irq);
                wm->pen_irq = 0;
        }
 }
-- 
2.20.0

Reply via email to