Re: [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux