Skip to contentSkip to conversation

omap3_beagle: init uart2 for beagle rev AX/BX only

PATCH New Govindraj.R 3 participants 6 messages Mar 6, 2012 – May 7, 2012

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

From: "Govindraj.R" <[email protected]>

All beagle boards rev > AX/BX have external usb hubs connected to ehci interface, external hub/peripheral uses a nreset sequence for which uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle boards expect rev Ax/BX.
(Reference to all beagle boards rev schematics:
http://beagleboard.org/hardware/design)

Initialising uart2 will lead to serial init taking over uart2_rx pin so init uart2_rx pin mux only for Beagle AX/BX rev boards. Dont init uart2 for all other boards allowing usb_ehci functionality.

To initialise individual uart port by id utilise and modify the existing available func. omap_serial_board_init.

---
 arch/arm/mach-omap2/board-omap3beagle.c  |    6 +++-
 arch/arm/mach-omap2/serial.c             |   41 ++++++++++++++++-------------
 arch/arm/plat-omap/include/plat/serial.h |    3 +-
 3 files changed, 30 insertions(+), 20 deletions(-)
arch/arm/mach-omap2/board-omap3beagle.c +5 -1
index 7ffcd28..19d6fb5 100644
@@ -126,6 +126,7 @@ static void __init omap3_beagle_init_rev(void)
 		beagle_config.mmc1_gpio_wp = 29;
 		beagle_config.reset_gpio = 170;
 		beagle_config.usr_button_gpio = 7;
+		omap_serial_board_init(NULL, 1);
 		break;
 	case 6:
 		printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
@@ -528,7 +529,10 @@ static void __init omap3_beagle_init(void)
 	platform_add_devices(omap3_beagle_devices,
 			ARRAY_SIZE(omap3_beagle_devices));
 	omap_display_init(&beagle_dss_data);
-	omap_serial_init();
+	omap_serial_board_init(NULL, 0);
+	omap_serial_board_init(NULL, 2);
+	omap_serial_board_init(NULL, 3);
+
 	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
 				  mt46h32m32lf6_sdrc_params);
 
arch/arm/mach-omap2/serial.c +23 -18

58 lines not on this page · raw message

arch/arm/plat-omap/include/plat/serial.h +2 -1
index 198d1e6..043b251 100644
@@ -111,7 +111,8 @@ struct omap_uart_port_info;
 
 extern void omap_serial_init(void);
 extern int omap_uart_can_sleep(void);
-extern void omap_serial_board_init(struct omap_uart_port_info *platform_data);
+extern void omap_serial_board_init(struct omap_uart_port_info *platform_data,
+		u8 port_id);
 extern void omap_serial_init_port(struct omap_board_data *bdata,
 		struct omap_uart_port_info *platform_data);
 #endif
Signature · 1 line
1.7.5.4
maintainer
#1 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

Quoted 16 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

All beagle boards rev > AX/BX have external usb hubs connected to ehci interface, external hub/peripheral uses a nreset sequence for which uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle boards expect rev Ax/BX.
(Reference to all beagle boards rev schematics:
http://beagleboard.org/hardware/design)

Initialising uart2 will lead to serial init taking over uart2_rx pin so init uart2_rx pin mux only for Beagle AX/BX rev boards. Dont init uart2 for all other boards allowing usb_ehci functionality.

To initialise individual uart port by id utilise and modify the existing available func. omap_serial_board_init.

Quoted 6 lines

Can somebody please test this on non-xm beagle too and reply with a Tested-by?

Thanks,

Tony

Quoted 111 lines
---
 arch/arm/mach-omap2/board-omap3beagle.c  |    6 +++-
 arch/arm/mach-omap2/serial.c             |   41 ++++++++++++++++-------------
 arch/arm/plat-omap/include/plat/serial.h |    3 +-
 3 files changed, 30 insertions(+), 20 deletions(-)
arch/arm/mach-omap2/board-omap3beagle.c +5 -1
index 7ffcd28..19d6fb5 100644
@@ -126,6 +126,7 @@ static void __init omap3_beagle_init_rev(void)
 		beagle_config.mmc1_gpio_wp = 29;
 		beagle_config.reset_gpio = 170;
 		beagle_config.usr_button_gpio = 7;
+		omap_serial_board_init(NULL, 1);
 		break;
 	case 6:
 		printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
@@ -528,7 +529,10 @@ static void __init omap3_beagle_init(void)
 	platform_add_devices(omap3_beagle_devices,
 			ARRAY_SIZE(omap3_beagle_devices));
 	omap_display_init(&beagle_dss_data);
-	omap_serial_init();
+	omap_serial_board_init(NULL, 0);
+	omap_serial_board_init(NULL, 2);
+	omap_serial_board_init(NULL, 3);
+
 	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
 				  mt46h32m32lf6_sdrc_params);
 
arch/arm/mach-omap2/serial.c +23 -18
index f590afc..e7c0462 100644
@@ -393,30 +393,32 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 /**
  * omap_serial_board_init() - initialize all supported serial ports
  * @info: platform specific data pointer
+ * @port_id: uart port number to be initialised
  *
- * Initializes all available UARTs as serial ports. Platforms
+ * Initializes individual UARTs as serial ports. Platforms
  * can call this function when they want to have default behaviour
- * for serial ports (e.g initialize them all as serial ports).
+ * for serial ports (e.g initialize individual serial ports based on port id).
  */
-void __init omap_serial_board_init(struct omap_uart_port_info *info)
+void __init omap_serial_board_init(struct omap_uart_port_info *info, u8 port_id)
 {
 	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);
-
-		if (!info)
-			omap_serial_init_port(&bdata, NULL);
-		else
-			omap_serial_init_port(&bdata, &info[uart->num]);
-	}
+	list_for_each_entry(uart, &uart_list, node)
+		if (uart->num == port_id) {
+			bdata.id = uart->num;
+			bdata.flags = 0;
+			bdata.pads = NULL;
+			bdata.pads_cnt = 0;
+
+			if (!cpu_is_omap24xx())
+				omap_serial_fill_default_pads(&bdata);
+
+			if (!info)
+				omap_serial_init_port(&bdata, NULL);
+			else
+				omap_serial_init_port(&bdata, info);
+		}
 }
 
 /**
@@ -428,5 +430,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)
  */
 void __init omap_serial_init(void)
 {
-	omap_serial_board_init(NULL);
+	struct omap_uart_state *uart;
+
+	list_for_each_entry(uart, &uart_list, node)
+		omap_serial_board_init(NULL, uart->num);
 }
arch/arm/plat-omap/include/plat/serial.h +2 -1
index 198d1e6..043b251 100644
@@ -111,7 +111,8 @@ struct omap_uart_port_info;
 
 extern void omap_serial_init(void);
 extern int omap_uart_can_sleep(void);
-extern void omap_serial_board_init(struct omap_uart_port_info *platform_data);
+extern void omap_serial_board_init(struct omap_uart_port_info *platform_data,
+		u8 port_id);
 extern void omap_serial_init_port(struct omap_board_data *bdata,
 		struct omap_uart_port_info *platform_data);
 #endif
Signature · 1 line
1.7.5.4
#2 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

Quoted 24 lines · Tony Lindgren
Quoted 16 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

All beagle boards rev > AX/BX have external usb hubs connected to ehci interface, external hub/peripheral uses a nreset sequence for which uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle boards expect rev Ax/BX.
(Reference to all beagle boards rev schematics:
http://beagleboard.org/hardware/design)

Initialising uart2 will lead to serial init taking over uart2_rx pin so init uart2_rx pin mux only for Beagle AX/BX rev boards. Dont init uart2 for all other boards allowing usb_ehci functionality.

To initialise individual uart port by id utilise and modify the existing available func. omap_serial_board_init.

Quoted 6 lines
Quoted 2 lines

Can somebody please test this on non-xm beagle too and reply with a Tested-by?

Here's an update for my: Tested-by: Robert Nelson <[email protected]>

Just tested with one of my Beagle C4's, (and re-verified the new patch on a xM B) using usb flash drives on the ehci port...

beagle c4:
v3.2.9
Bus 001 Device 002: ID 0457:0151 Silicon Integrated Systems Corp. Super Flash 1GB / GXT 64MB Flash Drive

v3.3-rc6:
ehci broken

v3.3-rc6 + this patch:
Bus 001 Device 002: ID 0457:0151 Silicon Integrated Systems Corp. Super Flash 1GB / GXT 64MB Flash Driv

beagle xM B:
v3.2.9
Bus 001 Device 004: ID 1977:0824 T-Logic

v3.3-rc6:
ehci broken

v3.3-rc6 + this patch:
Bus 001 Device 004: ID 1977:0824 T-Logic

Regards,

Signature · 2 lines
Robert Nelson
http://www.rcn-ee.com/
maintainer
#3 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

In reply to Govindraj.R

Hi,

Looking at this again..

Quoted 9 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

All beagle boards rev > AX/BX have external usb hubs connected to ehci interface, external hub/peripheral uses a nreset sequence for which uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle boards expect rev Ax/BX.
(Reference to all beagle boards rev schematics:
http://beagleboard.org/hardware/design)

Quoted 3 lines

Initialising uart2 will lead to serial init taking over uart2_rx pin so init uart2_rx pin mux only for Beagle AX/BX rev boards. Dont init uart2 for all other boards allowing usb_ehci functionality.

OK so the above got fixed for the muxing part with commit bce492c04ba8fc66a4ea0a52b181ba255daaaf54.

Quoted 2 lines

To initialise individual uart port by id utilise and modify the existing available func. omap_serial_board_init.

This makes sense as board specific fixes.

Quoted 12 lines
arch/arm/mach-omap2/board-omap3beagle.c +1 -0
@@ -126,6 +126,7 @@ static void __init omap3_beagle_init_rev(void)
 		beagle_config.mmc1_gpio_wp = 29;
 		beagle_config.reset_gpio = 170;
 		beagle_config.usr_button_gpio = 7;
+		omap_serial_board_init(NULL, 1);
 		break;
 	case 6:
 		printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
@@ -528,7 +529,10 @@ static void __init omap3_beagle_init(void)
 	platform_add_devices(omap3_beagle_devices,

arch/arm/mach-omap2/board-omap3beagle.c static void __init omap3_beagle_init(void) · line 538

Quoted 10 lines
arch/arm/mach-omap2/board-omap3beagle.c +4 -1
 			ARRAY_SIZE(omap3_beagle_devices));
 	omap_display_init(&beagle_dss_data);
-	omap_serial_init();
+	omap_serial_board_init(NULL, 0);
+	omap_serial_board_init(NULL, 2);
+	omap_serial_board_init(NULL, 3);
+
 	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
 				  mt46h32m32lf6_sdrc_params);
 

So this still looks valid, except now you also add the muxing for the uart pins instead of NULL? Note that you could define OMAP3_UART1_DEFAULT_PINS etc in some header.

Quoted 51 lines
arch/arm/mach-omap2/serial.c +19 -17
@@ -393,30 +393,32 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 /**
  * omap_serial_board_init() - initialize all supported serial ports
  * @info: platform specific data pointer
+ * @port_id: uart port number to be initialised
  *
- * Initializes all available UARTs as serial ports. Platforms
+ * Initializes individual UARTs as serial ports. Platforms
  * can call this function when they want to have default behaviour
- * for serial ports (e.g initialize them all as serial ports).
+ * for serial ports (e.g initialize individual serial ports based on port id).
  */
-void __init omap_serial_board_init(struct omap_uart_port_info *info)
+void __init omap_serial_board_init(struct omap_uart_port_info *info, u8 port_id)
 {
 	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);
-
-		if (!info)
-			omap_serial_init_port(&bdata, NULL);
-		else
-			omap_serial_init_port(&bdata, &info[uart->num]);
-	}
+	list_for_each_entry(uart, &uart_list, node)
+		if (uart->num == port_id) {
+			bdata.id = uart->num;
+			bdata.flags = 0;
+			bdata.pads = NULL;
+			bdata.pads_cnt = 0;
+
+			if (!cpu_is_omap24xx())
+				omap_serial_fill_default_pads(&bdata);
+
+			if (!info)
+				omap_serial_init_port(&bdata, NULL);
+			else
+				omap_serial_init_port(&bdata, info);
+		}
 }

arch/arm/mach-omap2/serial.c void __init omap_serial_board_init(struct omap_uart_port_info *info) · line 437

Quoted 9 lines
arch/arm/mach-omap2/serial.c +4 -1
@@ -428,5 +430,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)
  */
 void __init omap_serial_init(void)
 {
-	omap_serial_board_init(NULL);
+	struct omap_uart_state *uart;
+
+	list_for_each_entry(uart, &uart_list, node)
+		omap_serial_board_init(NULL, uart->num);
 }

Is this fix still needed? If so, it should probably be a separate fix with it's own description.

Regards,

Tony

#4 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

Quoted 108 lines · Tony Lindgren

Hi,

Looking at this again..

Quoted 9 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

All beagle boards rev > AX/BX have external usb hubs connected to ehci interface, external hub/peripheral uses a nreset sequence for which uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle boards expect rev Ax/BX.
(Reference to all beagle boards rev schematics:
http://beagleboard.org/hardware/design)

Quoted 3 lines

Initialising uart2 will lead to serial init taking over uart2_rx pin so init uart2_rx pin mux only for Beagle AX/BX rev boards. Dont init uart2 for all other boards allowing usb_ehci functionality.

OK so the above got fixed for the muxing part with commit bce492c04ba8fc66a4ea0a52b181ba255daaaf54.

Quoted 2 lines

To initialise individual uart port by id utilise and modify the existing available func. omap_serial_board_init.

This makes sense as board specific fixes.

Quoted 12 lines
arch/arm/mach-omap2/board-omap3beagle.c +1 -0
@@ -126,6 +126,7 @@ static void __init omap3_beagle_init_rev(void)
 ? ? ? ? ? ? ? beagle_config.mmc1_gpio_wp = 29;
 ? ? ? ? ? ? ? beagle_config.reset_gpio = 170;
 ? ? ? ? ? ? ? beagle_config.usr_button_gpio = 7;
+ ? ? ? ? ? ? omap_serial_board_init(NULL, 1);
 ? ? ? ? ? ? ? break;

? ? ? case 6:
? ? ? ? ? ? ? printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");

arch/arm/mach-omap2/board-omap3beagle.c +0 -0
@@ -528,7 +529,10 @@ static void __init omap3_beagle_init(void)
 ? ? ? platform_add_devices(omap3_beagle_devices,

arch/arm/mach-omap2/board-omap3beagle.c static void __init omap3_beagle_init(void) · line 538

Quoted 10 lines
arch/arm/mach-omap2/board-omap3beagle.c +4 -1
 ? ? ? ? ? ? ? ? ? ? ? ARRAY_SIZE(omap3_beagle_devices));
 ? ? ? omap_display_init(&beagle_dss_data);
- ? ? omap_serial_init();
+ ? ? omap_serial_board_init(NULL, 0);
+ ? ? omap_serial_board_init(NULL, 2);
+ ? ? omap_serial_board_init(NULL, 3);
+
 ? ? ? omap_sdrc_init(mt46h32m32lf6_sdrc_params,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mt46h32m32lf6_sdrc_params);
 

So this still looks valid, except now you also add the muxing for the uart pins instead of NULL? Note that you could define OMAP3_UART1_DEFAULT_PINS etc in some header.

Quoted 55 lines
arch/arm/mach-omap2/serial.c +0 -0
@@ -393,30 +393,32 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,

?/**
? * omap_serial_board_init() - initialize all supported serial ports ? * @info: platform specific data pointer
+ * @port_id: uart port number to be initialised
? *
- * Initializes all available UARTs as serial ports. Platforms
+ * Initializes individual UARTs as serial ports. Platforms
? * can call this function when they want to have default behaviour
- * for serial ports (e.g initialize them all as serial ports).
+ * for serial ports (e.g initialize individual serial ports based on port id). ? */

arch/arm/mach-omap2/serial.c +1 -1
-void __init omap_serial_board_init(struct omap_uart_port_info *info)
+void __init omap_serial_board_init(struct omap_uart_port_info *info, u8 port_id)

?{
? ? ? 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;

arch/arm/mach-omap2/serial.c +15 -9
-
- ? ? ? ? ? ? if (cpu_is_omap44xx() || cpu_is_omap34xx())
- ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata);
-
- ? ? ? ? ? ? if (!info)
- ? ? ? ? ? ? ? ? ? ? omap_serial_init_port(&bdata, NULL);
- ? ? ? ? ? ? else
- ? ? ? ? ? ? ? ? ? ? omap_serial_init_port(&bdata, &info[uart->num]);
- ? ? }
+ ? ? list_for_each_entry(uart, &uart_list, node)
+ ? ? ? ? ? ? if (uart->num == port_id) {
+ ? ? ? ? ? ? ? ? ? ? bdata.id = uart->num;
+ ? ? ? ? ? ? ? ? ? ? bdata.flags = 0;
+ ? ? ? ? ? ? ? ? ? ? bdata.pads = NULL;
+ ? ? ? ? ? ? ? ? ? ? bdata.pads_cnt = 0;
+
+ ? ? ? ? ? ? ? ? ? ? if (!cpu_is_omap24xx())
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? omap_serial_fill_default_pads(&bdata);
+
+ ? ? ? ? ? ? ? ? ? ? if (!info)
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? omap_serial_init_port(&bdata, NULL);
+ ? ? ? ? ? ? ? ? ? ? else
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? omap_serial_init_port(&bdata, info);
+ ? ? ? ? ? ? }

?}

arch/arm/mach-omap2/serial.c +0 -0
@@ -428,5 +430,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)

? */
?void __init omap_serial_init(void)
?{
- ? ? omap_serial_board_init(NULL);

Quoted 8 lines
Quoted 5 lines

+ ? ? struct omap_uart_state *uart;
+
+ ? ? list_for_each_entry(uart, &uart_list, node)
+ ? ? ? ? ? ? omap_serial_board_init(NULL, uart->num); ?}

Is this fix still needed? If so, it should probably be a separate fix with it's own description.

No this one is not needed anymore
since its fixed part of commit
bce492c04ba8fc66a4ea0a52b181ba255daaaf54

--
Thanks,
Govindraj.R

maintainer
#5 lore raw

PATCH 1/1 omap3_beagle: init uart2 for beagle rev AX/BX only

Quoted 8 lines · Raja, Govindraj
Quoted 2 lines · Tony Lindgren

Is this fix still needed? If so, it should probably be a separate fix with it's own description.

No this one is not needed anymore
since its fixed part of commit
bce492c04ba8fc66a4ea0a52b181ba255daaaf54

OK thanks for the update.

Tony