OMAP2+: UART: Fix usage of default mux pads
Subsystems (3)
cover OMAP2+: UART: Fix usage of default mux pads
From: "Govindraj.R" <[email protected]>
We populating default uart mux pins if no mux data is provided by board files. But were not probing the availability of uart pins in tx/rx mode i.e. mux mode0. If particular pin is used for any other purpose then default pads were breaking those peripherals e.g. uart2 pin was used as gpio nreset pin ehci on beagle board.
So remove the default adding procedure and probe the pins before using them as uart pins. Determine if uart pins are used in uart mux_mode0 then configure rx pin for wakeup capability.
Testing updates:
Boot tested on 3430SDP
Tested on beagle-xm with ehci module which needs uart pin muxed as gpio line for nreset sequence.
RX pad wakeup after enabling off mode in cpu_idle path and suspend path tested - 3430SDP & Beagle-XM
Govindraj.R (2):
OMAP2+: UART: Fix incorrect population of default uart pads OMAP2+: UART: Add mechanism to probe uart pins and configure rx
wakeup
arch/arm/mach-omap2/mux.c | 3 +- arch/arm/mach-omap2/mux.h | 10 +++ arch/arm/mach-omap2/serial.c | 164 +++++++++++++----------------------------- 3 files changed, 61 insertions(+), 116 deletions(-)
Signature · 1 line
1.7.9
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.
So remove the default pads adding.
--- arch/arm/mach-omap2/serial.c | 116 ------------------------------------------ 1 files changed, 0 insertions(+), 116 deletions(-)
arch/arm/mach-omap2/serial.c +0 -116
@@ -120,124 +120,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}#endif /* CONFIG_PM */ #ifdef CONFIG_OMAP_MUX -static struct omap_device_pad default_uart1_pads[]__initdata = { - { - .name ="uart1_cts.uart1_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rts.uart1_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_tx.uart1_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rx.uart1_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart2_pads[]__initdata = { - { - .name ="uart2_cts.uart2_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rts.uart2_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_tx.uart2_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rx.uart2_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart3_pads[]__initdata = { - { - .name ="uart3_cts_rctx.uart3_cts_rctx" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rts_sd.uart3_rts_sd" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_tx_irtx.uart3_tx_irtx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rx_irrx.uart3_rx_irrx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_omap36xx_uart4_pads[]__initdata = { - { - .name ="gpmc_wait2.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="gpmc_wait3.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - }, -}; - -static struct omap_device_pad default_omap4_uart4_pads[]__initdata = { - { - .name ="uart4_tx.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart4_rx.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; -static void omap_serial_fill_default_pads (struct omap_board_data *bdata) { -switch (bdata->id) { -case 0 : - bdata->pads = default_uart1_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart1_pads); -break ; -case 1 : - bdata->pads = default_uart2_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart2_pads); -break ; -case 2 : - bdata->pads = default_uart3_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart3_pads); -break ; -case 3 : -if (cpu_is_omap44xx ()) { - bdata->pads = default_omap4_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap4_uart4_pads); - }else if (cpu_is_omap3630 ()) { - bdata->pads = default_omap36xx_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap36xx_uart4_pads); - } -break ; -default : -break ; - } }#else static void omap_serial_fill_default_pads (struct omap_board_data *bdata) {}
Signature · 1 line
1.7.9
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 9 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ?ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.
Quoted 7 lines
So remove the default pads adding.
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>
Quoted 136 lines
---
?arch/arm/mach-omap2/serial.c | ?116 ------------------------------------------ ?1 files changed, 0 insertions(+), 116 deletions(-)arch/arm/mach-omap2/serial.c +0
-0@@ -120,124 +120,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +0
-89-static struct omap_device_pad default_uart1_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_cts.uart1_cts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_rts.uart1_rts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_tx.uart1_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_rx.uart1_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_uart2_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_cts.uart2_cts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_rts.uart2_rts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_tx.uart2_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_rx.uart2_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_uart3_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_cts_rctx.uart3_cts_rctx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_rts_sd.uart3_rts_sd", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_tx_irtx.uart3_tx_irtx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_rx_irrx.uart3_rx_irrx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_omap36xx_uart4_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "gpmc_wait2.uart4_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "gpmc_wait3.uart4_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE2, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE2, - ? ? ? }, -}; - -static struct omap_device_pad default_omap4_uart4_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart4_tx.uart4_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart4_rx.uart4_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? }, -}; -?static void
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
- ? ? ? switch (bdata->id) {
- ? ? ? case 0:
- ? ? ? ? ? ? ?bdata->pads=default_uart1_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart1_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 1:
- ? ? ? ? ? ? ?bdata->pads=default_uart2_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart2_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 2:
- ? ? ? ? ? ? ?bdata->pads=default_uart3_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart3_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 3:
- ? ? ? ? ? ? ? if (cpu_is_omap44xx()) {
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads=default_omap4_uart4_pads;
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads_cnt=
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ARRAY_SIZE(default_omap4_uart4_pads);
- ? ? ? ? ? ? ? } else if (cpu_is_omap3630()) {
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads=default_omap36xx_uart4_pads;
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads_cnt=
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ARRAY_SIZE(default_omap36xx_uart4_pads);
- ? ? ? ? ? ? ? }
- ? ? ? ? ? ? ? break;
- ? ? ? default:
- ? ? ? ? ? ? ? break;
- ? ? ? }
?}
?#else
?static voidomap_serial_fill_default_pads(struct omap_board_data *bdata){} --
1.7.9
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
In reply to Govindraj.RQuoted 9 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ?ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.
Quoted 7 lines
So remove the default pads adding.
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>
Quoted 136 lines
---
?arch/arm/mach-omap2/serial.c | ?116 ------------------------------------------ ?1 files changed, 0 insertions(+), 116 deletions(-)arch/arm/mach-omap2/serial.c +0
-0@@ -120,124 +120,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +0
-89-static struct omap_device_pad default_uart1_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_cts.uart1_cts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_rts.uart1_rts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_tx.uart1_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart1_rx.uart1_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_uart2_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_cts.uart2_cts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_rts.uart2_rts", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_tx.uart2_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart2_rx.uart2_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_uart3_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_cts_rctx.uart3_cts_rctx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_rts_sd.uart3_rts_sd", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_tx_irtx.uart3_tx_irtx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart3_rx_irrx.uart3_rx_irrx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? }, -}; - -static struct omap_device_pad default_omap36xx_uart4_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "gpmc_wait2.uart4_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "gpmc_wait3.uart4_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE2, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE2, - ? ? ? }, -}; - -static struct omap_device_pad default_omap4_uart4_pads[]__initdata = { - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart4_tx.uart4_tx", - ? ? ? ? ? ? ? .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0, - ? ? ? }, - ? ? ? { - ? ? ? ? ? ? ? .name ? = "uart4_rx.uart4_rx", - ? ? ? ? ? ? ? .flags ?= OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP, - ? ? ? ? ? ? ? .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? ? ? ? ? .idle ? = OMAP_PIN_INPUT | OMAP_MUX_MODE0, - ? ? ? }, -}; -?static void
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
- ? ? ? switch (bdata->id) {
- ? ? ? case 0:
- ? ? ? ? ? ? ?bdata->pads=default_uart1_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart1_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 1:
- ? ? ? ? ? ? ?bdata->pads=default_uart2_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart2_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 2:
- ? ? ? ? ? ? ?bdata->pads=default_uart3_pads;
- ? ? ? ? ? ? ?bdata->pads_cnt=ARRAY_SIZE(default_uart3_pads);
- ? ? ? ? ? ? ? break;
- ? ? ? case 3:
- ? ? ? ? ? ? ? if (cpu_is_omap44xx()) {
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads=default_omap4_uart4_pads;
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads_cnt=
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ARRAY_SIZE(default_omap4_uart4_pads);
- ? ? ? ? ? ? ? } else if (cpu_is_omap3630()) {
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads=default_omap36xx_uart4_pads;
- ? ? ? ? ? ? ? ? ? ? ?bdata->pads_cnt=
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ARRAY_SIZE(default_omap36xx_uart4_pads);
- ? ? ? ? ? ? ? }
- ? ? ? ? ? ? ? break;
- ? ? ? default:
- ? ? ? ? ? ? ? break;
- ? ? ? }
?}
?#else
?static voidomap_serial_fill_default_pads(struct omap_board_data *bdata){} --
1.7.9
Tony Lindgren
maintainerPATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 12 lines · Russ Dill
Quoted 11 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ?ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.So remove the default pads adding.
Quoted 7 lines
Quoted 5 lines
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>Acked-by Russ Dill <[email protected]>
Applying this into fixes with the updated comments as below.
Tony
From: "Govindraj.R" <[email protected]>
Date: Tue, 17 Apr 2012 10:35:47 -0700
Subject: [PATCH] ARM: OMAP2+: UART: Fix incorrect population of default uart pads
Commit (7496ba3 ARM: OMAP2+: UART: Add default mux for all uarts) wrongly added muxing of default pads for all uarts. This causes breakage on multiple boards using uart pins for alternate functions.
For example, on zoom3 random oopses can be seen with nfsroot as the smsc911x ethernet FIFO timings on GPMC bus are controlled by gpmc_wait2 and gpmc_wait3 pins. This means we can't mux these pads to uart4 functionality as commit 7496ba3 was doing.
Not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.
So remove the default pad muxing. Note that this is not a complete fix, as we now rely on bootloader set muxing for the uart wake-up events. Further patching is needed to enable wake-up events for uarts that are already muxed to uart mode.
arch/arm/mach-omap2/serial.c +0 -116
@@ -120,124 +120,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}#endif /* CONFIG_PM */ #ifdef CONFIG_OMAP_MUX -static struct omap_device_pad default_uart1_pads[]__initdata = { - { - .name ="uart1_cts.uart1_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rts.uart1_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_tx.uart1_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rx.uart1_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart2_pads[]__initdata = { - { - .name ="uart2_cts.uart2_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rts.uart2_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_tx.uart2_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rx.uart2_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart3_pads[]__initdata = { - { - .name ="uart3_cts_rctx.uart3_cts_rctx" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rts_sd.uart3_rts_sd" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_tx_irtx.uart3_tx_irtx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rx_irrx.uart3_rx_irrx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_omap36xx_uart4_pads[]__initdata = { - { - .name ="gpmc_wait2.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="gpmc_wait3.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - }, -}; - -static struct omap_device_pad default_omap4_uart4_pads[]__initdata = { - { - .name ="uart4_tx.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart4_rx.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; -static void omap_serial_fill_default_pads (struct omap_board_data *bdata) { -switch (bdata->id) { -case 0 : - bdata->pads = default_uart1_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart1_pads); -break ; -case 1 : - bdata->pads = default_uart2_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart2_pads); -break ; -case 2 : - bdata->pads = default_uart3_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart3_pads); -break ; -case 3 : -if (cpu_is_omap44xx ()) { - bdata->pads = default_omap4_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap4_uart4_pads); - }else if (cpu_is_omap3630 ()) { - bdata->pads = default_omap36xx_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap36xx_uart4_pads); - } -break ; -default : -break ; - } }#else static void omap_serial_fill_default_pads (struct omap_board_data *bdata) {}
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
In reply to Govindraj.RQuoted 10 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.So remove the default pads adding.
I just noticed that this patch breaks runtime PM & wakeups for UART console (at least on 3530/Overo with ttyO2 console.)
By removing the pads, the initial device_init_wakeup() is not called on port init. Without this call serial_omap_pm() disables runtime PM because it checks device_may_wakeup().
Since runtime PM was disabled, I manually re-enabled it and then enabled wakeups:
echo auto > /sys/devices/platform/omap_uart.2/power/control echo enabled > /sys/devices/platform/omap_uart.2/tty/ttyO2/power/wakeup
Then, after enabling auto-suspend timeouts, it seems wakeups are still not working since the console hangs.
Reverting $SUBJECT patch gets things working again.
Kevin
Quoted 138 lines
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>--- arch/arm/mach-omap2/serial.c | 116 ------------------------------------------ 1 files changed, 0 insertions(+), 116 deletions(-)arch/arm/mach-omap2/serial.c +0
-116@@ -120,124 +120,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}#endif /* CONFIG_PM */ #ifdef CONFIG_OMAP_MUX -static struct omap_device_pad default_uart1_pads[]__initdata = { - { - .name ="uart1_cts.uart1_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rts.uart1_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_tx.uart1_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart1_rx.uart1_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart2_pads[]__initdata = { - { - .name ="uart2_cts.uart2_cts" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rts.uart2_rts" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_tx.uart2_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart2_rx.uart2_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_uart3_pads[]__initdata = { - { - .name ="uart3_cts_rctx.uart3_cts_rctx" , - .enable =OMAP_PIN_INPUT_PULLUP |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rts_sd.uart3_rts_sd" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_tx_irtx.uart3_tx_irtx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart3_rx_irrx.uart3_rx_irrx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; - -static struct omap_device_pad default_omap36xx_uart4_pads[]__initdata = { - { - .name ="gpmc_wait2.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="gpmc_wait3.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE2 , - }, -}; - -static struct omap_device_pad default_omap4_uart4_pads[]__initdata = { - { - .name ="uart4_tx.uart4_tx" , - .enable =OMAP_PIN_OUTPUT |OMAP_MUX_MODE0 , - }, - { - .name ="uart4_rx.uart4_rx" , - .flags =OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP , - .enable =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - .idle =OMAP_PIN_INPUT |OMAP_MUX_MODE0 , - }, -}; -static void omap_serial_fill_default_pads (struct omap_board_data *bdata) { -switch (bdata->id) { -case 0 : - bdata->pads = default_uart1_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart1_pads); -break ; -case 1 : - bdata->pads = default_uart2_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart2_pads); -break ; -case 2 : - bdata->pads = default_uart3_pads; - bdata->pads_cnt =ARRAY_SIZE (default_uart3_pads); -break ; -case 3 : -if (cpu_is_omap44xx ()) { - bdata->pads = default_omap4_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap4_uart4_pads); - }else if (cpu_is_omap3630 ()) { - bdata->pads = default_omap36xx_uart4_pads; - bdata->pads_cnt = -ARRAY_SIZE (default_omap36xx_uart4_pads); - } -break ; -default : -break ; - } }#else static void omap_serial_fill_default_pads (struct omap_board_data *bdata) {}
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 23 lines · Kevin Hilman
Quoted 10 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ?ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.So remove the default pads adding.
I just noticed that this patch breaks runtime PM & wakeups for UART console (at least on 3530/Overo with ttyO2 console.)
By removing the pads, the initial
device_init_wakeup()is not called on port init. ?Without this callserial_omap_pm()disables runtime PM because it checksdevice_may_wakeup().Since runtime PM was disabled, I manually re-enabled it and then enabled wakeups:
Quoted 7 lines
?echo auto >
/sys/devices/platform/omap_uart.2/power/control?echo enabled >/sys/devices/platform/omap_uart.2/tty/ttyO2/power/wakeupThen, after enabling auto-suspend timeouts, it seems wakeups are still not working since the console hangs.
Reverting $SUBJECT patch gets things working again.
This was decided as part of discussion [1]
If we are _reconsidering_ taking this patch [2] to dynamically probe uart pins and enable rx wakeup.
I can re-work on the patch[2] as per tony's comments[1] and re-post it.
--
Thanks,
Govindraj.R
Tony Lindgren
maintainerPATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 32 lines · Raja, Govindraj
Quoted 23 lines · Kevin Hilman
Quoted 10 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ?ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.So remove the default pads adding.
I just noticed that this patch breaks runtime PM & wakeups for UART console (at least on 3530/Overo with ttyO2 console.)
By removing the pads, the initial
device_init_wakeup()is not called on port init. ?Without this callserial_omap_pm()disables runtime PM because it checksdevice_may_wakeup().Since runtime PM was disabled, I manually re-enabled it and then enabled wakeups:
Quoted 7 lines
?echo auto >
/sys/devices/platform/omap_uart.2/power/control?echo enabled >/sys/devices/platform/omap_uart.2/tty/ttyO2/power/wakeupThen, after enabling auto-suspend timeouts, it seems wakeups are still not working since the console hangs.
Reverting $SUBJECT patch gets things working again.
Quoted 7 lines
This was decided as part of discussion [1]
If we are _reconsidering_ taking this patch [2] to dynamically probe uart pins and enable rx wakeup.
I can re-work on the patch[2] as per tony's comments[1] and re-post it.
Just to follow up on this.. Let's first get things working reliably, and only then add more PM support.
We absolutely can't revert $SUBJECT because it's known to mess up at least smsc911x and ehci on zoom3, hsi on n900 and probably many other things.
For the -rc cycle, it seems that [2] is out of question at this point as too intrusive. If the PM & wakeups are broken in the default cases, then I suggest we just take few steps back and disable any deeper PM states in the -rc series.
Regards,
Tony
PATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 44 lines · Tony Lindgren
Quoted 32 lines · Raja, Govindraj
Quoted 23 lines · Kevin Hilman
Quoted 10 lines · Govindraj.R
From: "Govindraj.R" <[email protected]>
The following commit:
(7496ba3 ARM: OMAP2+: UART: Add default mux for all uarts) added default pads for all uarts. But not all boards tend to use all uarts and most of unused uart pins are muxed for other purpose. This commit breaks the modules which where trying to use unused uart pins on their boards.So remove the default pads adding.
I just noticed that this patch breaks runtime PM & wakeups for UART console (at least on 3530/Overo with ttyO2 console.)
By removing the pads, the initial
device_init_wakeup()is not called on port init. Without this callserial_omap_pm()disables runtime PM because it checksdevice_may_wakeup().Since runtime PM was disabled, I manually re-enabled it and then enabled wakeups:
Quoted 7 lines
echo auto >
/sys/devices/platform/omap_uart.2/power/controlecho enabled >/sys/devices/platform/omap_uart.2/tty/ttyO2/power/wakeupThen, after enabling auto-suspend timeouts, it seems wakeups are still not working since the console hangs.
Reverting $SUBJECT patch gets things working again.
Quoted 7 lines
This was decided as part of discussion [1]
If we are _reconsidering_ taking this patch [2] to dynamically probe uart pins and enable rx wakeup.
I can re-work on the patch[2] as per tony's comments[1] and re-post it.
Just to follow up on this.. Let's first get things working reliably, and only then add more PM support.
Quoted 8 lines
We absolutely can't revert $SUBJECT because it's known to mess up at least smsc911x and ehci on zoom3, hsi on n900 and probably many other things.
For the -rc cycle, it seems that [2] is out of question at this point as too intrusive. If the PM & wakeups are broken in the default cases, then I suggest we just take few steps back and disable any deeper PM states in the -rc series.
Unfortunately, no need to do anything more to disable deeper PM states.
Because $SUBJECT disables runtime PM for UART, it keeps both PER and CORE on all the time. :(
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Tony Lindgren
maintainerPATCH 1/2 OMAP2+: UART: Fix incorrect population of default uart pads
Quoted 14 lines · Kevin Hilman
Quoted 4 lines · Tony Lindgren
Just to follow up on this.. Let's first get things working reliably, and only then add more PM support.
Quoted 8 lines
We absolutely can't revert $SUBJECT because it's known to mess up at least smsc911x and ehci on zoom3, hsi on n900 and probably many other things.
For the -rc cycle, it seems that [2] is out of question at this point as too intrusive. If the PM & wakeups are broken in the default cases, then I suggest we just take few steps back and disable any deeper PM states in the -rc series.
Quoted 4 lines
Unfortunately, no need to do anything more to disable deeper PM states.
Because $SUBJECT disables runtime PM for UART, it keeps both PER and CORE on all the time. :(
Oh well, it seems that that runtime PM can now be enabled on per-board basis as it gets tested.
Regards,
Tony
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
In reply to Govindraj.RFrom: "Govindraj.R" <[email protected]>
Default pad populating procedure should first probe whether the uart pins are available as uart tx/rx pins if yes then we can configure them and use rx pin for wakeup capability.
Utilise the mux api available to probe the availability of mux pins in uart mode.
--- arch/arm/mach-omap2/mux.c | 3 +- arch/arm/mach-omap2/mux.h | 10 +++++++ arch/arm/mach-omap2/serial.c | 56 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 4 deletions(-)
arch/arm/mach-omap2/mux.c +1 -2
@@ -217,8 +217,7 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,return -ENODEV ; } -static int __init -omap_mux_get_by_name (const char *muxname, +int __init omap_mux_get_by_name (const char *muxname,struct omap_mux_partition **found_partition,struct omap_mux **found_mux) {
arch/arm/mach-omap2/mux.h +10 -0
@@ -225,8 +225,18 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);*/ void omap_hwmod_mux (struct omap_hwmod_mux_info *hmux,u8 state); +int omap_mux_get_by_name (const char *muxname, +struct omap_mux_partition **found_partition, +struct omap_mux **found_mux);#else +static inline int omap_mux_get_by_name (const char *muxname, +struct omap_mux_partition **found_partition, +struct omap_mux **found_mux) +{ +return 0 ; +} +static inline int omap_mux_init_gpio (int gpio,int val) {return 0 ;
arch/arm/mach-omap2/serial.c +54 -2
65 lines not on this page · raw message
Signature · 1 line
1.7.9
Tony Lindgren
maintainerPATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
arch/arm/mach-omap2/serial.c static void omap_uart_set_smartidle(struct platform_device *pdev) {} · line 127
Quoted 12 lines · Govindraj.R
arch/arm/mach-omap2/serial.c +5
-1@@ -120,11 +120,63 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}#endif /* CONFIG_PM */ #ifdef CONFIG_OMAP_MUX -static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ]__initdata ; +static struct omap_device_pad default_omap_uart_pads[2 ]__initdata ;
Won't the default_omap_uart_pads get overwritten for each port? We need that information in the driver too for each port? Why don't you just allocate bdata.pads in omap_serial_board_init as we now assume it's needed for each port?
Quoted 8 lines
arch/arm/mach-omap2/serial.c +7
-0+static void __init omap_serial_fill_default_pads (struct omap_board_data *bdata) { +struct omap_mux_partition *tx_partition =NULL , *rx_partition =NULL ; +struct omap_mux *rx_mux =NULL , *tx_mux =NULL ; + +if (bdata->id !=2 ) { +snprintf (rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN , +"uart%d_rx.uart%d_rx" , bdata->id +1 , bdata->id +1 );
arch/arm/mach-omap2/serial.c static void omap_uart_set_smartidle(struct platform_device *pdev) {} · line 146
Quoted 10 lines
arch/arm/mach-omap2/serial.c +10
-0+snprintf (tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN , +"uart%d_tx.uart%d_tx" , bdata->id +1 , bdata->id +1 ); + }else { +snprintf (rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN , +"uart%d_rx_irrx.uart%d_rx_irrx" , bdata->id +1 , + bdata->id +1 ); +snprintf (tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN , +"uart%d_tx_irtx.uart%d_tx_irtx" , bdata->id +1 , + bdata->id +1 ); + }
This would be simpler with something like this (untested):
char *rx_fmt, *tx_fmt;
int uart_nr = bdata->id + 1;
if (bdata->id == 2) {
rx_fmt = "uart%d_rx.uart%d_rx";
tx_fmt = "uart%d_tx.uart%d_tx";
} else {
rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx";
tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx";
}
snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt,
uart_nr, uart_nr);
snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt,
uart_nr, uart_nr);Quoted 19 lines
arch/arm/mach-omap2/serial.c +19
-0+if (omap_mux_get_by_name (rx_pad_name, &rx_partition, &rx_mux) >=0 && +omap_mux_get_by_name + (tx_pad_name, &tx_partition, &tx_mux) >=0 ) { +u16 tx_mode, rx_mode; + + tx_mode =omap_mux_read (tx_partition, tx_mux->reg_offset); + rx_mode =omap_mux_read (rx_partition, rx_mux->reg_offset); + +/* +* Check if uart is used in default tx/rx mode i.e. in mux mode0 +* if yes then configure rx pin for wake up capability +*/ +if (!(rx_mode &0x07 ) && !(tx_mode &0x07 )) { + default_omap_uart_pads[0 ].name = rx_pad_name; + default_omap_uart_pads[0 ].flags = +OMAP_DEVICE_PAD_REMUX |OMAP_DEVICE_PAD_WAKEUP ; + default_omap_uart_pads[0 ].enable =OMAP_PIN_INPUT | +OMAP_MUX_MODE0 ; + default_omap_uart_pads[0].idle = OMAP_PIN_INPUT |
arch/arm/mach-omap2/serial.c static void omap_uart_set_smartidle(struct platform_device *pdev) {} · line 176
Quoted 10 lines
arch/arm/mach-omap2/serial.c +9
-0+OMAP_MUX_MODE0 ; + + default_omap_uart_pads[1 ].name = tx_pad_name; + default_omap_uart_pads[1 ].enable =OMAP_PIN_OUTPUT | +OMAP_MUX_MODE0 ; + bdata->pads = default_omap_uart_pads; + bdata->pads_cnt =ARRAY_SIZE (default_omap_uart_pads); + } + } }
Then looking at omap_serial_board_init, it still looks wrong:
void __init omap_serial_board_init(struct omap_uart_port_info *info)
{
struct omap_uart_state *uart;
struct omap_board_data bdata;
list_for_each_entry(uart, &uart_list, node) {
bdata.id = uart->num;
bdata.flags = 0;
bdata.pads = NULL;
bdata.pads_cnt = 0;
if (cpu_is_omap44xx() || cpu_is_omap34xx())
omap_serial_fill_default_pads(&bdata);Why don't you fill the pads for omap2? It has the same pads, although it does not have the serial wake-up events working.
And why don't you exit if omap_serial_fill_default_pads fails for the no info case?
Shouldn't it be something like:
if (!info) {
res = omap_serial_fill_default_pads(&bdata);
if (!res)
return;
port = NULL;
} else {
port = &info[uart->num];
}
omap_serial_init_port(&bdata, port);Regards,
Tony
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
Quoted 6 lines · Tony Lindgren
Quoted 5 lines · Govindraj.R
arch/arm/mach-omap2/serial.c +0
-0@@ -120,11 +120,63 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/
Quoted 12 lines
arch/arm/mach-omap2/serial.c static void omap_uart_set_smartidle(struct platform_device *pdev) {} · line 127
Quoted 7 lines
?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN ? ? ? 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; +static struct omap_device_pad default_omap_uart_pads[2 ]__initdata ;Won't the
default_omap_uart_padsget overwritten for each port? We need that information in the driver too for each port? Why don't you just allocate bdata.pads inomap_serial_board_initas we now assume it's needed for each port?
Because of the way the function is used, it doesn't. It does seem somewhat fragile though, with non-obvious breakage possible in the future if someone changes the way omap_serial_fill_default_pads is called.
Quoted 104 lines
Quoted 10 lines
+static void ?__init
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
+ ? ? structomap_mux_partition*tx_partition= NULL,*rx_partition= NULL;
+ ? ? structomap_mux*rx_mux= NULL,*tx_mux= NULL;
+
+ ? ? if (bdata->id!= 2) {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_rx.uart%d_rx",bdata->id+ 1,bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_tx.uart%d_tx",bdata->id+ 1,bdata->id+ 1);Quoted 8 lines
+ ? ? } else {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_rx_irrx.uart%d_rx_irrx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_tx_irtx.uart%d_tx_irtx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? }This would be simpler with something like this (untested):
? ? ? ?char
*rx_fmt,*tx_fmt;
? ? ? ?intuart_nr=bdata->id+ 1;? ? ? ?if (
bdata->id== 2) {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx.uart%d_rx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx.uart%d_tx"; ? ? ? ?} else {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; ? ? ? ?}? ? ? ?snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
? ? ? ?snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);Quoted 28 lines
+ ? ? if (
omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux)>= 0 &&
+ ? ? ? ? ? ? ? ? ? ?omap_mux_get_by_name
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name,&tx_partition,&tx_mux) >= 0) {
+ ? ? ? ? ? ? u16tx_mode,rx_mode;arch/arm/mach-omap2/serial.c +24
-0+ + ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? /* + ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].name = rx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].flags ?= + ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].enable = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].name = tx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? bdata->pads = default_omap_uart_pads; + ? ? ? ? ? ? ? ? ? ? bdata->pads_cnt = ARRAY_SIZE(default_omap_uart_pads); + ? ? ? ? ? ? } + ? ? }Quoted 1 line
?}
Then looking at
omap_serial_board_init, it still looks wrong:void
__initomap_serial_board_init(struct omap_uart_port_info *info){
? ? ? ?structomap_uart_state*uart;
? ? ? ?structomap_board_databdata;? ? ? ?list_for_each_entry(uart,
&uart_list, node) { ? ? ? ? ? ? ? ?bdata.id =uart->num;
? ? ? ? ? ? ? ?bdata.flags = 0;
? ? ? ? ? ? ? ?bdata.pads = NULL;
? ? ? ? ? ? ? ?bdata.pads_cnt = 0;? ? ? ? ? ? ? ?if (
cpu_is_omap44xx()||cpu_is_omap34xx()) ? ? ? ? ? ? ? ? ? ? ? ?omap_serial_fill_default_pads(&bdata);Why don't you fill the pads for omap2? It has the same pads, although it does not have the serial wake-up events working.
And why don't you exit if
omap_serial_fill_default_padsfails for the no info case?Shouldn't it be something like:
? ? ? ? ? ? ? ?if (!info) {
? ? ? ? ? ? ? ? ? ? ? ?res =omap_serial_fill_default_pads(&bdata); ? ? ? ? ? ? ? ? ? ? ? ?if (!res)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return;
? ? ? ? ? ? ? ? ? ? ? ?port = NULL;
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? ? ?port = &info[uart->num];
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, port);Regards,
Tony
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
In reply to Tony LindgrenQuoted 6 lines · Tony Lindgren
Quoted 5 lines · Govindraj.R
arch/arm/mach-omap2/serial.c +0
-0@@ -120,11 +120,63 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/
Quoted 13 lines
arch/arm/mach-omap2/serial.c
Quoted 7 lines
?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN ? ? ? 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; +static struct omap_device_pad default_omap_uart_pads[2 ]__initdata ;Won't the
default_omap_uart_padsget overwritten for each port? We need that information in the driver too for each port? Why don't you just allocate bdata.pads inomap_serial_board_initas we now assume it's needed for each port?
Yes can be part of omap_uart_state structure.
Quoted 32 lines
Quoted 10 lines
+static void ?__init
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
+ ? ? structomap_mux_partition*tx_partition= NULL,*rx_partition= NULL;
+ ? ? structomap_mux*rx_mux= NULL,*tx_mux= NULL;
+
+ ? ? if (bdata->id!= 2) {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_rx.uart%d_rx",bdata->id+ 1,bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_tx.uart%d_tx",bdata->id+ 1,bdata->id+ 1);Quoted 8 lines
+ ? ? } else {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_rx_irrx.uart%d_rx_irrx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_tx_irtx.uart%d_tx_irtx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? }This would be simpler with something like this (untested):
? ? ? ?char
*rx_fmt,*tx_fmt;
? ? ? ?intuart_nr=bdata->id+ 1;? ? ? ?if (
bdata->id== 2) {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx.uart%d_rx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx.uart%d_tx"; ? ? ? ?} else {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; ? ? ? ?}
Quoted 5 lines
? ? ? ?snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
? ? ? ?snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
okay fine.
Quoted 54 lines
Quoted 28 lines
+ ? ? if (
omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux)>= 0 &&
+ ? ? ? ? ? ? ? ? ? ?omap_mux_get_by_name
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name,&tx_partition,&tx_mux) >= 0) {
+ ? ? ? ? ? ? u16tx_mode,rx_mode;arch/arm/mach-omap2/serial.c +24
-0+ + ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? /* + ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].name = rx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].flags ?= + ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].enable = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].name = tx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? bdata->pads = default_omap_uart_pads; + ? ? ? ? ? ? ? ? ? ? bdata->pads_cnt = ARRAY_SIZE(default_omap_uart_pads); + ? ? ? ? ? ? } + ? ? }Quoted 1 line
?}
Then looking at
omap_serial_board_init, it still looks wrong:void
__initomap_serial_board_init(struct omap_uart_port_info *info){
? ? ? ?structomap_uart_state*uart;
? ? ? ?structomap_board_databdata;? ? ? ?list_for_each_entry(uart,
&uart_list, node) { ? ? ? ? ? ? ? ?bdata.id =uart->num;
? ? ? ? ? ? ? ?bdata.flags = 0;
? ? ? ? ? ? ? ?bdata.pads = NULL;
? ? ? ? ? ? ? ?bdata.pads_cnt = 0;? ? ? ? ? ? ? ?if (
cpu_is_omap44xx()||cpu_is_omap34xx()) ? ? ? ? ? ? ? ? ? ? ? ?omap_serial_fill_default_pads(&bdata);Why don't you fill the pads for omap2? It has the same pads, although it does not have the serial wake-up events working.
And why don't you exit if
omap_serial_fill_default_padsfails for the no info case?Shouldn't it be something like:
Quoted 10 lines
? ? ? ? ? ? ? ?if (!info) {
? ? ? ? ? ? ? ? ? ? ? ?res =omap_serial_fill_default_pads(&bdata); ? ? ? ? ? ? ? ? ? ? ? ?if (!res)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return;
? ? ? ? ? ? ? ? ? ? ? ?port = NULL;
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? ? ?port = &info[uart->num];
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, port);
Yes if filling of default pads fails we can avoid registering that port however I think that should not depend on availability of port info.
Here [1] is the updated patch.
--
Thanks,
Govindraj.R
[1]:
Quoted 1 line
From
ea06c7d5014b68f622b3e2ca226e5a5194d48e9aMon Sep 17 00:00:00 2001
From: "Govindraj.R" <[email protected]>
Date: Tue, 10 Apr 2012 18:21:52 +0530
Subject: [PATCH 2/2] OMAP2+: UART: Add mechanism to probe uart pins and
configure rx wakeup
Default pad populating procedure should first probe whether the uart pins are available as uart tx/rx pins if yes then we can configure them and use rx pin for wakeup capability.
Utilise the mux api available to probe the availability of mux pins in uart mode.
--- arch/arm/mach-omap2/mux.c | 3 +- arch/arm/mach-omap2/mux.h | 10 ++++++ arch/arm/mach-omap2/serial.c | 73 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/mux.c +0 -0
@@ -217,8 +217,7 @@ static int __init _omap_mux_get_by_name(struct
omap_mux_partition *partition,
return -ENODEV;
}
-static int __init
-omap_mux_get_by_name(const char *muxname,
+int __init omap_mux_get_by_name(const char *muxname,
struct omap_mux_partition **found_partition, struct omap_mux **found_mux)
{
arch/arm/mach-omap2/mux.h +0 -0
@@ -225,8 +225,18 @@ omap_hwmod_mux_init(struct omap_device_pad
*bpads, int nr_pads);
*/
void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state);
+int omap_mux_get_by_name(const char *muxname,
+ struct omap_mux_partition **found_partition,
+ struct omap_mux **found_mux);
#else
+static inline int omap_mux_get_by_name(const char *muxname,
+ struct omap_mux_partition **found_partition,
+ struct omap_mux **found_mux)
+{
+ return 0;
+}
+
static inline int omap_mux_init_gpio(int gpio, int val) {
return 0;
arch/arm/mach-omap2/serial.c +1 -0
@@ -57,6 +57,7 @@ struct omap_uart_state {struct list_head node;struct omap_hwmod *oh; +struct omap_device_pad default_omap_uart_pads[2 ]; };static LIST_HEAD (uart_list);
@@ -120,11 +121,75 @@ static void omap_uart_set_smartidle(struct
platform_device *pdev) {}
#endif /* CONFIG_PM */
#ifdef CONFIG_OMAP_MUX
-static void omap_serial_fill_default_pads(struct omap_board_data *bdata) +
+#define OMAP_UART_DEFAULT_PAD_NAME_LEN 28
+static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN],
+ tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata;
+
+static void __init
+omap_serial_fill_uart_tx_rx_pads(struct omap_board_data *bdata,
+ struct omap_uart_state *uart)
{
+ uart->default_omap_uart_pads[0].name = rx_pad_name;
+ uart->default_omap_uart_pads[0].flags = OMAP_DEVICE_PAD_REMUX |
+ OMAP_DEVICE_PAD_WAKEUP;
+ uart->default_omap_uart_pads[0].enable = OMAP_PIN_INPUT |
+ OMAP_MUX_MODE0;
+ uart->default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0;
+ uart->default_omap_uart_pads[1].name = tx_pad_name;
+ uart->default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT |
+ OMAP_MUX_MODE0;
+ bdata->pads = uart->default_omap_uart_pads;
+ bdata->pads_cnt = ARRAY_SIZE(uart->default_omap_uart_pads);
+}
+
+static int __init omap_serial_fill_default_pads(struct omap_board_data *bdata,
+ struct omap_uart_state *uart)
+{
+ struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL;
+ struct omap_mux *rx_mux = NULL, *tx_mux = NULL;
+ char *rx_fmt, *tx_fmt;
+ int uart_nr = bdata->id + 1;
+
+ if (bdata->id != 2) {
+ rx_fmt = "uart%d_rx.uart%d_rx";
+ tx_fmt = "uart%d_tx.uart%d_tx";
+ } else {
+ rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx";
+ tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx";
+ }
+
+ snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt,
+ uart_nr, uart_nr);
+ snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt,
+ uart_nr, uart_nr);
+
+ if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 &&
+ omap_mux_get_by_name
+ (tx_pad_name, &tx_partition, &tx_mux) >= 0) {
+ u16 tx_mode, rx_mode;
+
+ tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset);
+ rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset);
+
+ /*
+ * Check if uart is used in default tx/rx mode i.e. in mux mode0
+ * if yes then configure rx pin for wake up capability
+ */
+ if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) {
+ omap_serial_fill_uart_tx_rx_pads(bdata, uart);
+ return 0;
+ }
+ }
+
+ return -ENODEV;
}
#else
-static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {} +static int __init omap_serial_fill_default_pads(struct omap_board_data *bdata
+ struct omap_uart_state *uart)
+{
+ return 0;
+}
#endif
char *cmdline_find_option(char *str)
@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)
bdata.pads = NULL;
bdata.pads_cnt = 0;
- if (cpu_is_omap44xx() || cpu_is_omap34xx())
- omap_serial_fill_default_pads(&bdata);
+ if (omap_serial_fill_default_pads(&bdata, uart))
+ continue;
if (!info)
omap_serial_init_port(&bdata, NULL);
Signature · 1 line
1.7.9
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
Quoted 151 lines · Govindraj
Quoted 6 lines · Tony Lindgren
Quoted 5 lines · Govindraj.R
arch/arm/mach-omap2/serial.c +0
-0@@ -120,11 +120,63 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/Quoted 13 lines
arch/arm/mach-omap2/serial.c
Quoted 7 lines
?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN ? ? ? 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; +static struct omap_device_pad default_omap_uart_pads[2 ]__initdata ;Won't the
default_omap_uart_padsget overwritten for each port? We need that information in the driver too for each port? Why don't you just allocate bdata.pads inomap_serial_board_initas we now assume it's needed for each port?Yes can be part of
omap_uart_statestructure.Quoted 32 lines
Quoted 10 lines
+static void ?__init
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
+ ? ? structomap_mux_partition*tx_partition= NULL,*rx_partition= NULL;
+ ? ? structomap_mux*rx_mux= NULL,*tx_mux= NULL;
+
+ ? ? if (bdata->id!= 2) {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_rx.uart%d_rx",bdata->id+ 1,bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_tx.uart%d_tx",bdata->id+ 1,bdata->id+ 1);Quoted 8 lines
+ ? ? } else {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_rx_irrx.uart%d_rx_irrx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_tx_irtx.uart%d_tx_irtx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? }This would be simpler with something like this (untested):
? ? ? ?char
*rx_fmt,*tx_fmt;
? ? ? ?intuart_nr=bdata->id+ 1;? ? ? ?if (
bdata->id== 2) {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx.uart%d_rx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx.uart%d_tx"; ? ? ? ?} else {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; ? ? ? ?}Quoted 5 lines
? ? ? ?snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
? ? ? ?snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);okay fine.
Quoted 54 lines
Quoted 28 lines
+ ? ? if (
omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux)>= 0 &&
+ ? ? ? ? ? ? ? ? ? ?omap_mux_get_by_name
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name,&tx_partition,&tx_mux) >= 0) {
+ ? ? ? ? ? ? u16tx_mode,rx_mode;arch/arm/mach-omap2/serial.c +24
-0+ + ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? /* + ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].name = rx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].flags ?= + ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].enable = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].name = tx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? bdata->pads = default_omap_uart_pads; + ? ? ? ? ? ? ? ? ? ? bdata->pads_cnt = ARRAY_SIZE(default_omap_uart_pads); + ? ? ? ? ? ? } + ? ? }Quoted 1 line
?}
Then looking at
omap_serial_board_init, it still looks wrong:void
__initomap_serial_board_init(struct omap_uart_port_info *info){
? ? ? ?structomap_uart_state*uart;
? ? ? ?structomap_board_databdata;? ? ? ?list_for_each_entry(uart,
&uart_list, node) { ? ? ? ? ? ? ? ?bdata.id =uart->num;
? ? ? ? ? ? ? ?bdata.flags = 0;
? ? ? ? ? ? ? ?bdata.pads = NULL;
? ? ? ? ? ? ? ?bdata.pads_cnt = 0;? ? ? ? ? ? ? ?if (
cpu_is_omap44xx()||cpu_is_omap34xx()) ? ? ? ? ? ? ? ? ? ? ? ?omap_serial_fill_default_pads(&bdata);Why don't you fill the pads for omap2? It has the same pads, although it does not have the serial wake-up events working.
And why don't you exit if
omap_serial_fill_default_padsfails for the no info case?Shouldn't it be something like:
Quoted 10 lines
? ? ? ? ? ? ? ?if (!info) {
? ? ? ? ? ? ? ? ? ? ? ?res =omap_serial_fill_default_pads(&bdata); ? ? ? ? ? ? ? ? ? ? ? ?if (!res)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return;
? ? ? ? ? ? ? ? ? ? ? ?port = NULL;
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? ? ?port = &info[uart->num];
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, port);Yes if filling of default pads fails we can avoid registering that port however I think that should not depend on availability of port info.
Here [1] is the updated patch.
--
Thanks,
Govindraj.R[1]:
From
ea06c7d5014b68f622b3e2ca226e5a5194d48e9aMon Sep 17 00:00:00 2001
From: "Govindraj.R" <[email protected]>
Date: Tue, 10 Apr 2012 18:21:52 +0530
Subject: [PATCH 2/2] OMAP2+: UART: Add mechanism to probe uart pins and ?configure rx wakeupDefault pad populating procedure should first probe whether the uart pins are available as uart tx/rx pins if yes then we can configure them and use rx pin for wakeup capability.
Quoted 8 lines
Utilise the mux api available to probe the availability of mux pins in uart mode.
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>
This patch has been seriously damaged by your mailer. What mailer are you using? Tested against master on xM for USB and NFS boot.
Quoted 150 lines
---
?arch/arm/mach-omap2/mux.c ? ?| ? ?3 +- ?arch/arm/mach-omap2/mux.h ? ?| ? 10 ++++++ ?arch/arm/mach-omap2/serial.c | ? 73 +++++++++++++++++++++++++++++++++++++++--?3 files changed, 80 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/mux.c +1
-2@@ -217,8 +217,7 @@ static int __init _omap_mux_get_by_name(structomap_mux_partition *partition, ? ? ? ?return -ENODEV; ?} -static int __init -omap_mux_get_by_name (const char *muxname, +int __init omap_mux_get_by_name (const char *muxname, ? ? ? ? ? ? ? ? ? ? ? ?struct omap_mux_partition **found_partition, ? ? ? ? ? ? ? ? ? ? ? ?struct omap_mux **found_mux)?{
arch/arm/mach-omap2/mux.h +0
-0@@ -225,8 +225,18 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);?*/
?voidomap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state);+int omap_mux_get_by_name(const char *muxname,
+ ? ? ? ? ? ? ? structomap_mux_partition**found_partition,
+ ? ? ? ? ? ? ? structomap_mux**found_mux); ?#elsearch/arm/mach-omap2/mux.h +7
-0+static inline int omap_mux_get_by_name (const char *muxname, + ? ? ? ? ? ? ? struct omap_mux_partition **found_partition, + ? ? ? ? ? ? ? struct omap_mux **found_mux) +{ + ? ? ? return 0; +} +?static inline int
omap_mux_init_gpio(int gpio, int val)?{
? ? ? ?return 0;arch/arm/mach-omap2/serial.c +1
-0@@ -57,6 +57,7 @@ struct omap_uart_state { ? ? ? ?struct list_head node; ? ? ? ?struct omap_hwmod *oh; + ? ? ? struct omap_device_pad default_omap_uart_pads[2]; ?}; ?static LIST_HEAD(uart_list);@@ -120,11 +121,75 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +8
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; + +static void ?__init +omap_serial_fill_uart_tx_rx_pads (struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart)?{
+ ? ? ? uart->default_omap_uart_pads[0].name =rx_pad_name;
+ ? ? ? uart->default_omap_uart_pads[0].flags =OMAP_DEVICE_PAD_REMUX|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_DEVICE_PAD_WAKEUP;
+ ? ? ? uart->default_omap_uart_pads[0].enable =OMAP_PIN_INPUT|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_MUX_MODE0;
+ ? ? ? uart->default_omap_uart_pads[0].idle =OMAP_PIN_INPUT|OMAP_MUX_MODE0;
+ ? ? ? uart->default_omap_uart_pads[1].name =tx_pad_name;
+ ? ? ? uart->default_omap_uart_pads[1].enable =OMAP_PIN_OUTPUT|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_MUX_MODE0;
+ ? ? ?bdata->pads=uart->default_omap_uart_pads;
+ ? ? ?bdata->pads_cnt=ARRAY_SIZE(uart->default_omap_uart_pads);arch/arm/mach-omap2/serial.c +42
-0+} + +static int ?__init omap_serial_fill_default_pads(struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? ? struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; + ? ? ? struct omap_mux *rx_mux = NULL, *tx_mux = NULL; + ? ? ? char *rx_fmt, *tx_fmt; + ? ? ? int uart_nr = bdata->id + 1; + + ? ? ? if (bdata->id != 2) { + ? ? ? ? ? ? ? rx_fmt = "uart%d_rx.uart%d_rx"; + ? ? ? ? ? ? ? tx_fmt = "uart%d_tx.uart%d_tx"; + ? ? ? } else { + ? ? ? ? ? ? ? rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; + ? ? ? ? ? ? ? tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; + ? ? ? } + + ? ? ? snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt, + ? ? ? ? ? ? ? ? ? ? ? uart_nr, uart_nr); + ? ? ? snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt, + ? ? ? ? ? ? ? ? ? ? ? uart_nr, uart_nr); + + ? ? ? if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 && + ? ? ? ? ? ? ? ? ? ? ? omap_mux_get_by_name + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name, &tx_partition, &tx_mux) >= 0) { + ? ? ? ? ? ? ? u16 tx_mode, rx_mode; + + ? ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? ? /* + ? ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? ? omap_serial_fill_uart_tx_rx_pads(bdata, uart); + ? ? ? ? ? ? ? ? ? ? ? return 0; + ? ? ? ? ? ? ? } + ? ? ? } + + ? ? ? return -ENODEV;?}
?#elsearch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) {} +static int __init omap_serial_fill_default_pads(struct omap_board_data *bdata + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? ? return 0; +}?#endif
?char *cmdline_find_option(char *str)
arch/arm/mach-omap2/serial.c +2
-2@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info) ? ? ? ? ? ? ? ?bdata.pads = NULL; ? ? ? ? ? ? ? ?bdata.pads_cnt = 0; - ? ? ? ? ? ? ? if (cpu_is_omap44xx() || cpu_is_omap34xx()) - ? ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata); + ? ? ? ? ? ? ? if (omap_serial_fill_default_pads(&bdata, uart)) + ? ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ?if (!info)? ? ? ? ? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, NULL); --
1.7.9
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
In reply to Raja, GovindrajQuoted 151 lines · Govindraj
Quoted 6 lines · Tony Lindgren
Quoted 5 lines · Govindraj.R
arch/arm/mach-omap2/serial.c +0
-0@@ -120,11 +120,63 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/Quoted 13 lines
arch/arm/mach-omap2/serial.c
Quoted 7 lines
?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN ? ? ? 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; +static struct omap_device_pad default_omap_uart_pads[2 ]__initdata ;Won't the
default_omap_uart_padsget overwritten for each port? We need that information in the driver too for each port? Why don't you just allocate bdata.pads inomap_serial_board_initas we now assume it's needed for each port?Yes can be part of
omap_uart_statestructure.Quoted 32 lines
Quoted 10 lines
+static void ?__init
omap_serial_fill_default_pads(struct omap_board_data *bdata)?{
+ ? ? structomap_mux_partition*tx_partition= NULL,*rx_partition= NULL;
+ ? ? structomap_mux*rx_mux= NULL,*tx_mux= NULL;
+
+ ? ? if (bdata->id!= 2) {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_rx.uart%d_rx",bdata->id+ 1,bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? ?"uart%d_tx.uart%d_tx",bdata->id+ 1,bdata->id+ 1);Quoted 8 lines
+ ? ? } else {
+ ? ? ? ? ? ? snprintf(rx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_rx_irrx.uart%d_rx_irrx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? ? ? ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,
+ ? ? ? ? ? ? ? ? ? ? "uart%d_tx_irtx.uart%d_tx_irtx",bdata->id+ 1,
+ ? ? ? ? ? ? ? ? ? ?bdata->id+ 1);
+ ? ? }This would be simpler with something like this (untested):
? ? ? ?char
*rx_fmt,*tx_fmt;
? ? ? ?intuart_nr=bdata->id+ 1;? ? ? ?if (
bdata->id== 2) {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx.uart%d_rx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx.uart%d_tx"; ? ? ? ?} else {
? ? ? ? ? ? ? ?rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; ? ? ? ? ? ? ? ?tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; ? ? ? ?}Quoted 5 lines
? ? ? ?snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
? ? ? ?snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt, ? ? ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);okay fine.
Quoted 54 lines
Quoted 28 lines
+ ? ? if (
omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux)>= 0 &&
+ ? ? ? ? ? ? ? ? ? ?omap_mux_get_by_name
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name,&tx_partition,&tx_mux) >= 0) {
+ ? ? ? ? ? ? u16tx_mode,rx_mode;arch/arm/mach-omap2/serial.c +24
-0+ + ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? /* + ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].name = rx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].flags ?= + ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].enable = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].name = tx_pad_name; + ? ? ? ? ? ? ? ? ? ? default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OMAP_MUX_MODE0; + ? ? ? ? ? ? ? ? ? ? bdata->pads = default_omap_uart_pads; + ? ? ? ? ? ? ? ? ? ? bdata->pads_cnt = ARRAY_SIZE(default_omap_uart_pads); + ? ? ? ? ? ? } + ? ? }Quoted 1 line
?}
Then looking at
omap_serial_board_init, it still looks wrong:void
__initomap_serial_board_init(struct omap_uart_port_info *info){
? ? ? ?structomap_uart_state*uart;
? ? ? ?structomap_board_databdata;? ? ? ?list_for_each_entry(uart,
&uart_list, node) { ? ? ? ? ? ? ? ?bdata.id =uart->num;
? ? ? ? ? ? ? ?bdata.flags = 0;
? ? ? ? ? ? ? ?bdata.pads = NULL;
? ? ? ? ? ? ? ?bdata.pads_cnt = 0;? ? ? ? ? ? ? ?if (
cpu_is_omap44xx()||cpu_is_omap34xx()) ? ? ? ? ? ? ? ? ? ? ? ?omap_serial_fill_default_pads(&bdata);Why don't you fill the pads for omap2? It has the same pads, although it does not have the serial wake-up events working.
And why don't you exit if
omap_serial_fill_default_padsfails for the no info case?Shouldn't it be something like:
Quoted 10 lines
? ? ? ? ? ? ? ?if (!info) {
? ? ? ? ? ? ? ? ? ? ? ?res =omap_serial_fill_default_pads(&bdata); ? ? ? ? ? ? ? ? ? ? ? ?if (!res)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return;
? ? ? ? ? ? ? ? ? ? ? ?port = NULL;
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? ? ?port = &info[uart->num];
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, port);Yes if filling of default pads fails we can avoid registering that port however I think that should not depend on availability of port info.
Here [1] is the updated patch.
--
Thanks,
Govindraj.R[1]:
From
ea06c7d5014b68f622b3e2ca226e5a5194d48e9aMon Sep 17 00:00:00 2001
From: "Govindraj.R" <[email protected]>
Date: Tue, 10 Apr 2012 18:21:52 +0530
Subject: [PATCH 2/2] OMAP2+: UART: Add mechanism to probe uart pins and ?configure rx wakeupDefault pad populating procedure should first probe whether the uart pins are available as uart tx/rx pins if yes then we can configure them and use rx pin for wakeup capability.
Quoted 8 lines
Utilise the mux api available to probe the availability of mux pins in uart mode.
Cc Felipe Balbi <[email protected]>Cc Kevin Hilman <[email protected]>Cc Russ Dill <[email protected]>Reported-by Tony Lindgren <[email protected]>Signed-off-by Govindraj.R <[email protected]>
Quoted 150 lines
---
?arch/arm/mach-omap2/mux.c ? ?| ? ?3 +- ?arch/arm/mach-omap2/mux.h ? ?| ? 10 ++++++ ?arch/arm/mach-omap2/serial.c | ? 73 +++++++++++++++++++++++++++++++++++++++--?3 files changed, 80 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/mux.c +1
-2@@ -217,8 +217,7 @@ static int __init _omap_mux_get_by_name(structomap_mux_partition *partition, ? ? ? ?return -ENODEV; ?} -static int __init -omap_mux_get_by_name (const char *muxname, +int __init omap_mux_get_by_name (const char *muxname, ? ? ? ? ? ? ? ? ? ? ? ?struct omap_mux_partition **found_partition, ? ? ? ? ? ? ? ? ? ? ? ?struct omap_mux **found_mux)?{
arch/arm/mach-omap2/mux.h +0
-0@@ -225,8 +225,18 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);?*/
?voidomap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state);+int omap_mux_get_by_name(const char *muxname,
+ ? ? ? ? ? ? ? structomap_mux_partition**found_partition,
+ ? ? ? ? ? ? ? structomap_mux**found_mux); ?#elsearch/arm/mach-omap2/mux.h +7
-0+static inline int omap_mux_get_by_name (const char *muxname, + ? ? ? ? ? ? ? struct omap_mux_partition **found_partition, + ? ? ? ? ? ? ? struct omap_mux **found_mux) +{ + ? ? ? return 0; +} +?static inline int
omap_mux_init_gpio(int gpio, int val)?{
? ? ? ?return 0;arch/arm/mach-omap2/serial.c +1
-0@@ -57,6 +57,7 @@ struct omap_uart_state { ? ? ? ?struct list_head node; ? ? ? ?struct omap_hwmod *oh; + ? ? ? struct omap_device_pad default_omap_uart_pads[2]; ?}; ?static LIST_HEAD(uart_list);@@ -120,11 +121,75 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}?#endif /*
CONFIG_PM*/?#ifdef
CONFIG_OMAP_MUXarch/arm/mach-omap2/serial.c +8
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN 28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN ], + ? ? ? ? ? ? ? tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; + +static void ?__init +omap_serial_fill_uart_tx_rx_pads (struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart)?{
+ ? ? ? uart->default_omap_uart_pads[0].name =rx_pad_name;
+ ? ? ? uart->default_omap_uart_pads[0].flags =OMAP_DEVICE_PAD_REMUX|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_DEVICE_PAD_WAKEUP;
+ ? ? ? uart->default_omap_uart_pads[0].enable =OMAP_PIN_INPUT|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_MUX_MODE0;
+ ? ? ? uart->default_omap_uart_pads[0].idle =OMAP_PIN_INPUT|OMAP_MUX_MODE0;
+ ? ? ? uart->default_omap_uart_pads[1].name =tx_pad_name;
+ ? ? ? uart->default_omap_uart_pads[1].enable =OMAP_PIN_OUTPUT|
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_MUX_MODE0;
+ ? ? ?bdata->pads=uart->default_omap_uart_pads;
+ ? ? ?bdata->pads_cnt=ARRAY_SIZE(uart->default_omap_uart_pads);arch/arm/mach-omap2/serial.c +42
-0+} + +static int ?__init omap_serial_fill_default_pads(struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? ? struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; + ? ? ? struct omap_mux *rx_mux = NULL, *tx_mux = NULL; + ? ? ? char *rx_fmt, *tx_fmt; + ? ? ? int uart_nr = bdata->id + 1; + + ? ? ? if (bdata->id != 2) { + ? ? ? ? ? ? ? rx_fmt = "uart%d_rx.uart%d_rx"; + ? ? ? ? ? ? ? tx_fmt = "uart%d_tx.uart%d_tx"; + ? ? ? } else { + ? ? ? ? ? ? ? rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; + ? ? ? ? ? ? ? tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; + ? ? ? } + + ? ? ? snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt, + ? ? ? ? ? ? ? ? ? ? ? uart_nr, uart_nr); + ? ? ? snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt, + ? ? ? ? ? ? ? ? ? ? ? uart_nr, uart_nr); + + ? ? ? if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 && + ? ? ? ? ? ? ? ? ? ? ? omap_mux_get_by_name + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (tx_pad_name, &tx_partition, &tx_mux) >= 0) { + ? ? ? ? ? ? ? u16 tx_mode, rx_mode; + + ? ? ? ? ? ? ? tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); + ? ? ? ? ? ? ? rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + + ? ? ? ? ? ? ? /* + ? ? ? ? ? ? ? ?* Check if uart is used in default tx/rx mode i.e. in mux mode0 + ? ? ? ? ? ? ? ?* if yes then configure rx pin for wake up capability + ? ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? ? if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) { + ? ? ? ? ? ? ? ? ? ? ? omap_serial_fill_uart_tx_rx_pads(bdata, uart); + ? ? ? ? ? ? ? ? ? ? ? return 0; + ? ? ? ? ? ? ? } + ? ? ? } + + ? ? ? return -ENODEV;?}
?#elsearch/arm/mach-omap2/serial.c +5
-1-static void omap_serial_fill_default_pads (struct omap_board_data *bdata) {} +static int __init omap_serial_fill_default_pads(struct omap_board_data *bdata + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? ? return 0; +}?#endif
?char *cmdline_find_option(char *str)
arch/arm/mach-omap2/serial.c +2
-2@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info) ? ? ? ? ? ? ? ?bdata.pads = NULL; ? ? ? ? ? ? ? ?bdata.pads_cnt = 0; - ? ? ? ? ? ? ? if (cpu_is_omap44xx() || cpu_is_omap34xx()) - ? ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata); + ? ? ? ? ? ? ? if (omap_serial_fill_default_pads(&bdata, uart)) + ? ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ?if (!info)? ? ? ? ? ? ? ? ? ? ? ?omap_serial_init_port(&bdata, NULL); --
1.7.9
Tony Lindgren
maintainerPATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
In reply to Raja, GovindrajHi,
Few more comments below.
* Raja, Govindraj <[email protected]> [120411 04:53]:
...
Quoted 10 lines
(quoted diff) +10
-0+static int __init omap_serial_fill_default_pads(struct omap_board_data *bdata, + struct omap_uart_state *uart) +{ + struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; + struct omap_mux *rx_mux = NULL, *tx_mux = NULL; + char *rx_fmt, *tx_fmt; + int uart_nr = bdata->id + 1; + + if (bdata->id != 2) { + rx_fmt = "uart%d_rx.uart%d_rx";
Review
Quoted 10 lines
(quoted diff) +10
-0+ tx_fmt = "uart%d_tx.uart%d_tx"; + } else { + rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; + tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; + } + + snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt, + uart_nr, uart_nr); + snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt, + uart_nr, uart_nr);
This naming won't work for the fourth port on 3630 as there are no "uart4_rx" or "uart4_tx" mux entries, they are "gpmc_wait2.uart4_tx" and "gpmc_wait3.uart4_tx".
Quoted 11 lines
(quoted diff) +2
-2@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info) bdata.pads = NULL; bdata.pads_cnt = 0; - if (cpu_is_omap44xx() || cpu_is_omap34xx()) - omap_serial_fill_default_pads(&bdata); + if (omap_serial_fill_default_pads(&bdata, uart)) + continue; if (!info)
Quoted 1 line
omap_serial_init_port(&bdata, NULL);
Can't the omap_serial_board_init() now be just be omap_serial_init(void) as it's not used anywhere else?
Anyways, this is getting too complex for the -rc series as at least 2430sdp is using alternative pins for the first uart. Let's patch to remove just the uart4 entry for 3630 for the -rc and then we can properly fix this for the next merge window.
Regards,
Tony
PATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
Quoted 23 lines · Tony Lindgren
Hi,
Few more comments below.
* Raja, Govindraj <[email protected]> [120411 04:53]:
...Quoted 16 lines
(quoted diff) +16
-0+static int ?__init omap_serial_fill_default_pads(struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; + ? ? struct omap_mux *rx_mux = NULL, *tx_mux = NULL; + ? ? char *rx_fmt, *tx_fmt; + ? ? int uart_nr = bdata->id + 1; + + ? ? if (bdata->id != 2) { + ? ? ? ? ? ? rx_fmt = "uart%d_rx.uart%d_rx"; + ? ? ? ? ? ? tx_fmt = "uart%d_tx.uart%d_tx"; + ? ? } else { + ? ? ? ? ? ? rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; + ? ? ? ? ? ? tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; + ? ? } +
Quoted 8 lines
Quoted 4 lines
+ ? ? snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt,
+ ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
+ ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt,
+ ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);This naming won't work for the fourth port on 3630 as there are no "
uart4_rx" or "uart4_tx" mux entries, they are "gpmc_wait2.uart4_tx" and "gpmc_wait3.uart4_tx".
But uart4 is unused on 3630 boards and boards trying to use them should configure them from board file.
(I thought we agreed on this approach where only if uarts are available in mux mode0 those ports will be dynamically muxed for wakeup others should use omap_serial_init_port)
Quoted 11 lines
Quoted 11 lines
(quoted diff) +2
-2@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info) ? ? ? ? ? ? ? bdata.pads = NULL; ? ? ? ? ? ? ? bdata.pads_cnt = 0; - ? ? ? ? ? ? if (cpu_is_omap44xx() || cpu_is_omap34xx()) - ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata); + ? ? ? ? ? ? if (omap_serial_fill_default_pads(&bdata, uart)) + ? ? ? ? ? ? ? ? ? ? continue;
Quoted 5 lines
Quoted 2 lines
(quoted diff) +0
-0? ? ? ? ? ? ? if (!info)? ? ? ? ? ? ? ? ? ? ?
omap_serial_init_port(&bdata, NULL);Can't the
omap_serial_board_init()now be just beomap_serial_init(void)as it's not used anywhere else?
Yes sure we can remove that.
Quoted 5 lines
Anyways, this is getting too complex for the -rc series as at least 2430sdp is using alternative pins for the first uart. Let's patch to remove just the uart4 entry for 3630 for the -rc and then we can properly fix this for the next merge window.
Okay. in that case the earlier patch [1] should be fine to solve the gpmc issue observed
and ehci issue on beagle-xm.
--
Thanks,
Govindraj.R
[1]:
http://lists.infradead.org/pipermail/linux-arm-kernel/2012-March/090961.html
Tony Lindgren
maintainerPATCH 2/2 OMAP2+: UART: Add mechanism to probe uart pins and configure rx wakeup
Quoted 33 lines · Raja, Govindraj
Quoted 23 lines · Tony Lindgren
Hi,
Few more comments below.
* Raja, Govindraj <[email protected]> [120411 04:53]:
...Quoted 16 lines
(quoted diff) +16
-0+static int ?__init omap_serial_fill_default_pads(struct omap_board_data *bdata, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_uart_state *uart) +{ + ? ? struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; + ? ? struct omap_mux *rx_mux = NULL, *tx_mux = NULL; + ? ? char *rx_fmt, *tx_fmt; + ? ? int uart_nr = bdata->id + 1; + + ? ? if (bdata->id != 2) { + ? ? ? ? ? ? rx_fmt = "uart%d_rx.uart%d_rx"; + ? ? ? ? ? ? tx_fmt = "uart%d_tx.uart%d_tx"; + ? ? } else { + ? ? ? ? ? ? rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; + ? ? ? ? ? ? tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; + ? ? } +Quoted 8 lines
Quoted 4 lines
+ ? ? snprintf(rx_pad_name,
OMAP_UART_DEFAULT_PAD_NAME_LEN,rx_fmt,
+ ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);
+ ? ? snprintf(tx_pad_name,OMAP_UART_DEFAULT_PAD_NAME_LEN,tx_fmt,
+ ? ? ? ? ? ? ? ? ? ?uart_nr,uart_nr);This naming won't work for the fourth port on 3630 as there are no "
uart4_rx" or "uart4_tx" mux entries, they are "gpmc_wait2.uart4_tx" and "gpmc_wait3.uart4_tx".
Quoted 5 lines
But uart4 is unused on 3630 boards and boards trying to use them should configure them from board file.
(I thought we agreed on this approach where only if uarts are available in mux mode0 those ports will be dynamically muxed for wakeup others should useomap_serial_init_port)
Right, but you're still trying to do mux_get_by_name on it to check the pads, which will produce a warning on 3630.
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
(quoted diff) +2
-2@@ -289,8 +354,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info) ? ? ? ? ? ? ? bdata.pads = NULL; ? ? ? ? ? ? ? bdata.pads_cnt = 0; - ? ? ? ? ? ? if (cpu_is_omap44xx() || cpu_is_omap34xx()) - ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata); + ? ? ? ? ? ? if (omap_serial_fill_default_pads(&bdata, uart)) + ? ? ? ? ? ? ? ? ? ? continue;
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
(quoted diff) +0
-0? ? ? ? ? ? ? if (!info)? ? ? ? ? ? ? ? ? ? ?
omap_serial_init_port(&bdata, NULL);Can't the
omap_serial_board_init()now be just beomap_serial_init(void)as it's not used anywhere else?Yes sure we can remove that.
OK
Quoted 7 lines
Quoted 4 lines
Anyways, this is getting too complex for the -rc series as at least 2430sdp is using alternative pins for the first uart. Let's patch to remove just the uart4 entry for 3630 for the -rc and then we can properly fix this for the next merge window.
Okay. in that case the earlier patch [1] should be fine to solve the gpmc issue observed and ehci issue on beagle-xm.
I'll just use your first patch to remove _all_ the muxing for omap_serial_init(). That's really the only safe thing we can do for the -rc cycle.
This means we rely on bootloader settings for console muxing and wake-up bits, but that's just what we need to live with until next merge window.
And for the next merge window, I think we should only automatically enable the wake-up event bits if the port is in serial mode, and not do any other muxing. Something like:
void __init omap_serial_init(void)
{
struct omap_uart_state *uart;
struct omap_board_data bdata;
list_for_each_entry(uart, &uart_list, node) {
bdata.id = uart->num;
bdata.flags = 0;
bdata.pads = NULL;
bdata.pads_cnt = 0;
omap_serial_check_wakeup(&bdata);
omap_serial_init_port(&bdata, NULL);
}
omap_serial_board_init(NULL);
}Where omap_serial_check_wakeup() just enables the wake-up if the port is already muxed to uart mode. So it turns out we can't bail out for unmuxed uarts because some boards use alternative pads like 2430sdp does for the first uart.
Regards,
Tony