linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors
@ 2023-05-17 21:01 Linus Walleij
  2023-05-17 21:23 ` Aaro Koskinen
  0 siblings, 1 reply; 3+ messages in thread
From: Linus Walleij @ 2023-05-17 21:01 UTC (permalink / raw)
  To: Aaro Koskinen, Janusz Krzysztofik, Tony Lindgren
  Cc: linux-omap, Linus Walleij

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@linaro.org>
---
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 ++++++
 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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors
  2023-05-17 21:01 [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors Linus Walleij
@ 2023-05-17 21:23 ` Aaro Koskinen
  2023-05-17 21:37   ` Linus Walleij
  0 siblings, 1 reply; 3+ messages in thread
From: Aaro Koskinen @ 2023-05-17 21:23 UTC (permalink / raw)
  To: Linus Walleij; +Cc: Janusz Krzysztofik, Tony Lindgren, linux-omap

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@linaro.org>
> ---
> 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
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors
  2023-05-17 21:23 ` Aaro Koskinen
@ 2023-05-17 21:37   ` Linus Walleij
  0 siblings, 0 replies; 3+ messages in thread
From: Linus Walleij @ 2023-05-17 21:37 UTC (permalink / raw)
  To: Aaro Koskinen; +Cc: Janusz Krzysztofik, Tony Lindgren, linux-omap

On Wed, May 17, 2023 at 11:24 PM Aaro Koskinen <aaro.koskinen@iki.fi> wrote:

> This is omap16xx specific, so only 770 and osk need this.

Aha I get it, I fix!

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-05-17 21:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-17 21:01 [PATCH v2] ARM: omap1: Make serial wakeup GPIOs use descriptors Linus Walleij
2023-05-17 21:23 ` Aaro Koskinen
2023-05-17 21:37   ` Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).