34b6abb
From: "Govindraj.R" <govindraj.raja at ti.com>
34b6abb
34b6abb
All beagle boards rev > AX/BX have external usb hubs connected to ehci
34b6abb
interface, external hub/peripheral uses a nreset sequence for which
34b6abb
uart2_rx.gpio_147 pin in mux mode4(USB2HS_nRST) is used on all beagle
34b6abb
boards expect rev Ax/BX.
34b6abb
(Reference to all beagle boards rev schematics:
34b6abb
http://beagleboard.org/hardware/design)
34b6abb
34b6abb
Initialising uart2 will lead to serial init taking over uart2_rx pin
34b6abb
so init uart2_rx pin mux only for Beagle AX/BX rev boards.
34b6abb
Dont init uart2 for all other boards allowing usb_ehci functionality.
34b6abb
34b6abb
To initialise individual uart port by id utilise and modify the existing
34b6abb
available func. omap_serial_board_init.
34b6abb
34b6abb
Cc: Tony Lindgren <tony at atomide.com>
34b6abb
Cc: Kevin Hilman <khilman at ti.com>
34b6abb
Cc: Koen Kooi <koen at dominion.thruhere.net>
34b6abb
Tested-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
34b6abb
Tested-by: Robert Nelson <robertcnelson at gmail.com>
34b6abb
Signed-off-by: Govindraj.R <govindraj.raja at ti.com>
34b6abb
---
34b6abb
 arch/arm/mach-omap2/board-omap3beagle.c  |    6 +++-
34b6abb
 arch/arm/mach-omap2/serial.c             |   41 ++++++++++++++++-------------
34b6abb
 arch/arm/plat-omap/include/plat/serial.h |    3 +-
34b6abb
 3 files changed, 30 insertions(+), 20 deletions(-)
34b6abb
34b6abb
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
34b6abb
index 7ffcd28..19d6fb5 100644
34b6abb
--- a/arch/arm/mach-omap2/board-omap3beagle.c
34b6abb
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
34b6abb
@@ -126,6 +126,7 @@ static void __init omap3_beagle_init_rev(void)
34b6abb
 		beagle_config.mmc1_gpio_wp = 29;
34b6abb
 		beagle_config.reset_gpio = 170;
34b6abb
 		beagle_config.usr_button_gpio = 7;
34b6abb
+		omap_serial_board_init(NULL, 1);
34b6abb
 		break;
34b6abb
 	case 6:
34b6abb
 		printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
34b6abb
@@ -528,7 +529,10 @@ static void __init omap3_beagle_init(void)
34b6abb
 	platform_add_devices(omap3_beagle_devices,
34b6abb
 			ARRAY_SIZE(omap3_beagle_devices));
34b6abb
 	omap_display_init(&beagle_dss_data);
34b6abb
-	omap_serial_init();
34b6abb
+	omap_serial_board_init(NULL, 0);
34b6abb
+	omap_serial_board_init(NULL, 2);
34b6abb
+	omap_serial_board_init(NULL, 3);
34b6abb
+
34b6abb
 	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
34b6abb
 				  mt46h32m32lf6_sdrc_params);
34b6abb
 
34b6abb
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
34b6abb
index f590afc..e7c0462 100644
34b6abb
--- a/arch/arm/mach-omap2/serial.c
34b6abb
+++ b/arch/arm/mach-omap2/serial.c
34b6abb
@@ -393,30 +393,32 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
34b6abb
 /**
34b6abb
  * omap_serial_board_init() - initialize all supported serial ports
34b6abb
  * @info: platform specific data pointer
34b6abb
+ * @port_id: uart port number to be initialised
34b6abb
  *
34b6abb
- * Initializes all available UARTs as serial ports. Platforms
34b6abb
+ * Initializes individual UARTs as serial ports. Platforms
34b6abb
  * can call this function when they want to have default behaviour
34b6abb
- * for serial ports (e.g initialize them all as serial ports).
34b6abb
+ * for serial ports (e.g initialize individual serial ports based on port id).
34b6abb
  */
34b6abb
-void __init omap_serial_board_init(struct omap_uart_port_info *info)
34b6abb
+void __init omap_serial_board_init(struct omap_uart_port_info *info, u8 port_id)
34b6abb
 {
34b6abb
 	struct omap_uart_state *uart;
34b6abb
 	struct omap_board_data bdata;
34b6abb
 
34b6abb
-	list_for_each_entry(uart, &uart_list, node) {
34b6abb
-		bdata.id = uart->num;
34b6abb
-		bdata.flags = 0;
34b6abb
-		bdata.pads = NULL;
34b6abb
-		bdata.pads_cnt = 0;
34b6abb
-
34b6abb
-		if (cpu_is_omap44xx() || cpu_is_omap34xx())
34b6abb
-			omap_serial_fill_default_pads(&bdata);
34b6abb
-
34b6abb
-		if (!info)
34b6abb
-			omap_serial_init_port(&bdata, NULL);
34b6abb
-		else
34b6abb
-			omap_serial_init_port(&bdata, &info[uart->num]);
34b6abb
-	}
34b6abb
+	list_for_each_entry(uart, &uart_list, node)
34b6abb
+		if (uart->num == port_id) {
34b6abb
+			bdata.id = uart->num;
34b6abb
+			bdata.flags = 0;
34b6abb
+			bdata.pads = NULL;
34b6abb
+			bdata.pads_cnt = 0;
34b6abb
+
34b6abb
+			if (!cpu_is_omap24xx())
34b6abb
+				omap_serial_fill_default_pads(&bdata);
34b6abb
+
34b6abb
+			if (!info)
34b6abb
+				omap_serial_init_port(&bdata, NULL);
34b6abb
+			else
34b6abb
+				omap_serial_init_port(&bdata, info);
34b6abb
+		}
34b6abb
 }
34b6abb
 
34b6abb
 /**
34b6abb
@@ -428,5 +430,8 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)
34b6abb
  */
34b6abb
 void __init omap_serial_init(void)
34b6abb
 {
34b6abb
-	omap_serial_board_init(NULL);
34b6abb
+	struct omap_uart_state *uart;
34b6abb
+
34b6abb
+	list_for_each_entry(uart, &uart_list, node)
34b6abb
+		omap_serial_board_init(NULL, uart->num);
34b6abb
 }
34b6abb
diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h
34b6abb
index 198d1e6..043b251 100644
34b6abb
--- a/arch/arm/plat-omap/include/plat/serial.h
34b6abb
+++ b/arch/arm/plat-omap/include/plat/serial.h
34b6abb
@@ -111,7 +111,8 @@ struct omap_uart_port_info;
39acffa
 struct omap_uart_port_info;
34b6abb
 
34b6abb
 extern void omap_serial_init(void);
34b6abb
-extern void omap_serial_board_init(struct omap_uart_port_info *platform_data);
34b6abb
+extern void omap_serial_board_init(struct omap_uart_port_info *platform_data,
34b6abb
+		u8 port_id);
34b6abb
 extern void omap_serial_init_port(struct omap_board_data *bdata,
34b6abb
 		struct omap_uart_port_info *platform_data);
34b6abb
 #endif
34b6abb
-- 
34b6abb
1.7.5.4