Hi, On Wed, May 17, 2023 at 11:01:35PM +0200, Linus Walleij wrote: > 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. > > Fixes: 92bf78b33b0b ("gpio: omap: use dynamic allocation of base") > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > ChangeLog v1->v2: > - Fix missing comma > - Push descriptors down to each boardfile NULL device GPIO > table > --- > arch/arm/mach-omap1/board-ams-delta.c | 14 +++++++++++++ > arch/arm/mach-omap1/board-nokia770.c | 7 +++++++ > arch/arm/mach-omap1/board-osk.c | 7 +++++++ > arch/arm/mach-omap1/board-palmte.c | 7 +++++++ > arch/arm/mach-omap1/board-sx1.c | 6 ++++++ This is omap16xx specific, so only 770 and osk need this. A. > arch/arm/mach-omap1/serial.c | 30 +++++++++++++-------------- > 6 files changed, 56 insertions(+), 15 deletions(-) > > diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c > index ac47ab9fe096..31c04ef78412 100644 > --- a/arch/arm/mach-omap1/board-ams-delta.c > +++ b/arch/arm/mach-omap1/board-ams-delta.c > @@ -541,6 +541,19 @@ static struct gpiod_lookup_table keybrd_pwr_gpio_table = { > }, > }; > > +static struct gpiod_lookup_table ams_delta_serial_wakeup_gpio_table = { > + .dev_id = NULL, > + .table = { > + 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), > + { } > + }, > +}; > + > static struct platform_device *ams_delta_devices[] __initdata = { > &latch1_gpio_device, > &latch2_gpio_device, > @@ -558,6 +571,7 @@ static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = { > &keybrd_pwr_gpio_table, > &ams_delta_lcd_gpio_table, > &ams_delta_nand_gpio_table, > + &ams_delta_serial_wakeup_gpio_table, > }; > > /* > diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c > index 9cca594d97c7..417861a25856 100644 > --- a/arch/arm/mach-omap1/board-nokia770.c > +++ b/arch/arm/mach-omap1/board-nokia770.c > @@ -293,6 +293,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), > { } > }, > }; > diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c > index a8ca8d427182..463687b9ca52 100644 > --- a/arch/arm/mach-omap1/board-osk.c > +++ b/arch/arm/mach-omap1/board-osk.c > @@ -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), > { } > }, > }; > diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c > index 49b7757cb2fd..b8ca63b9117e 100644 > --- a/arch/arm/mach-omap1/board-palmte.c > +++ b/arch/arm/mach-omap1/board-palmte.c > @@ -224,6 +224,13 @@ static struct gpiod_lookup_table palmte_irq_gpio_table = { > /* GPIO used for USB or DC input detection */ > GPIO_LOOKUP("gpio-0-15", PALMTE_USB_OR_DC_GPIO, "usb_dc_irq", > 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), > { } > }, > }; > diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c > index a13c630be7b7..2f03e1662815 100644 > --- a/arch/arm/mach-omap1/board-sx1.c > +++ b/arch/arm/mach-omap1/board-sx1.c > @@ -314,6 +314,12 @@ static struct gpiod_lookup_table sx1_gpio_table = { > GPIO_ACTIVE_HIGH), > GPIO_LOOKUP("gpio-0-15", 15, "usb_on", > GPIO_ACTIVE_HIGH), > + 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), > { } > }, > }; > diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c > index c7f590645774..3adceb97138f 100644 > --- a/arch/arm/mach-omap1/serial.c > +++ b/arch/arm/mach-omap1/serial.c > @@ -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; > } > -- > 2.34.1 >