ARM: omap1: Make serial wakeup GPIOs use descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 30 Apr 2023 17:51:30 +0000 (19:51 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 24 May 2023 13:01:45 +0000 (15:01 +0200)
The code in serial.c looks up GPIOs corresponding to a line
on the UART when muxed in as GPIO to use this as a wakeup
on serial activity for OMAP1.

Utilize the NULL device to define some board-specific
GPIO lookups and use these to immediately look up the
same GPIOs, set as input and convert to IRQ numbers,
then set these to wakeup IRQs. This is ugly but should work.

This is only needed on the OSK1 and Nokia 770 devices that
use the OMAP16xx.

Fixes: 92bf78b33b0b ("gpio: omap: use dynamic allocation of base")
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/mach-omap1/board-nokia770.c
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap1/serial.c

index dd1a8f439fac44bf607ca17a5ae850679edd44eb..5ea27ca26abf232f64fb8669baa1cd4368213e04 100644 (file)
@@ -294,6 +294,13 @@ static struct gpiod_lookup_table nokia770_irq_gpio_table = {
                /* GPIO used for tahvo IRQ */
                GPIO_LOOKUP("gpio-32-47", 8, "tahvo_irq",
                            GPIO_ACTIVE_HIGH),
+               /* GPIOs used by serial wakeup IRQs */
+               GPIO_LOOKUP_IDX("gpio-32-47", 5, "wakeup", 0,
+                           GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP_IDX("gpio-16-31", 2, "wakeup", 1,
+                           GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP_IDX("gpio-48-63", 1, "wakeup", 2,
+                           GPIO_ACTIVE_HIGH),
                { }
        },
 };
index a8ca8d427182d659c37af145f4c6337b386e29f5..463687b9ca52abf055ba352e6e4108b618f3899f 100644 (file)
@@ -364,6 +364,13 @@ static struct gpiod_lookup_table osk_irq_gpio_table = {
                /* GPIO used by the TPS65010 chip */
                GPIO_LOOKUP("mpuio", 1, "tps65010",
                            GPIO_ACTIVE_HIGH),
+               /* GPIOs used for serial wakeup IRQs */
+               GPIO_LOOKUP_IDX("gpio-32-47", 5, "wakeup", 0,
+                           GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP_IDX("gpio-16-31", 2, "wakeup", 1,
+                           GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP_IDX("gpio-48-63", 1, "wakeup", 2,
+                           GPIO_ACTIVE_HIGH),
                { }
        },
 };
index c7f5906457748a208aa136264eec63d77db9c7a2..3adceb97138fba7bcd4dee34e0172fcaee1bd06f 100644 (file)
@@ -4,7 +4,8 @@
  *
  * OMAP1 serial support.
  */
-#include <linux/gpio.h>
+#include <linux/gpio/machine.h>
+#include <linux/gpio/consumer.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -196,39 +197,38 @@ void omap_serial_wake_trigger(int enable)
        }
 }
 
-static void __init omap_serial_set_port_wakeup(int gpio_nr)
+static void __init omap_serial_set_port_wakeup(int idx)
 {
+       struct gpio_desc *d;
        int ret;
 
-       ret = gpio_request(gpio_nr, "UART wake");
-       if (ret < 0) {
-               printk(KERN_ERR "Could not request UART wake GPIO: %i\n",
-                      gpio_nr);
+       d = gpiod_get_index(NULL, "wakeup", idx, GPIOD_IN);
+       if (IS_ERR(d)) {
+               pr_err("Unable to get UART wakeup GPIO descriptor\n");
                return;
        }
-       gpio_direction_input(gpio_nr);
-       ret = request_irq(gpio_to_irq(gpio_nr), &omap_serial_wake_interrupt,
+       ret = request_irq(gpiod_to_irq(d), &omap_serial_wake_interrupt,
                          IRQF_TRIGGER_RISING, "serial wakeup", NULL);
        if (ret) {
-               gpio_free(gpio_nr);
-               printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n",
-                      gpio_nr);
+               gpiod_put(d);
+               pr_err("No interrupt for UART%d wake GPIO\n", idx + 1);
                return;
        }
-       enable_irq_wake(gpio_to_irq(gpio_nr));
+       enable_irq_wake(gpiod_to_irq(d));
 }
 
+
 int __init omap_serial_wakeup_init(void)
 {
        if (!cpu_is_omap16xx())
                return 0;
 
        if (uart1_ck != NULL)
-               omap_serial_set_port_wakeup(37);
+               omap_serial_set_port_wakeup(0);
        if (uart2_ck != NULL)
-               omap_serial_set_port_wakeup(18);
+               omap_serial_set_port_wakeup(1);
        if (uart3_ck != NULL)
-               omap_serial_set_port_wakeup(49);
+               omap_serial_set_port_wakeup(2);
 
        return 0;
 }