Created
November 17, 2017 22:29
-
-
Save kallisti5/a2035e19469b19962c280d26da5f7b07 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/headers/private/kernel/arch/generic/debug_uart_8250.h b/headers/private/kernel/arch/generic/debug_uart_8250.h | |
index e7f211f2a5..57b9557e55 100644 | |
--- a/headers/private/kernel/arch/generic/debug_uart_8250.h | |
+++ b/headers/private/kernel/arch/generic/debug_uart_8250.h | |
@@ -33,7 +33,8 @@ public: | |
}; | |
-extern DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock); | |
+extern DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock, | |
+ uint32 flags); | |
#endif /* _KERNEL_ARCH_DEBUG_UART_8250_H */ | |
diff --git a/src/system/kernel/arch/arm/arch_uart_8250.cpp b/src/system/kernel/arch/arm/arch_uart_8250.cpp | |
index ef3d06d0e7..ca0ddb85f5 100644 | |
--- a/src/system/kernel/arch/arm/arch_uart_8250.cpp | |
+++ b/src/system/kernel/arch/arm/arch_uart_8250.cpp | |
@@ -9,25 +9,31 @@ | |
#include <arch/arm/reg.h> | |
#include <arch/generic/debug_uart_8250.h> | |
+#include <arch/arm/arch_uart_8250.h> | |
#include <debug.h> | |
#include <new> | |
class ArchUART8250 : public DebugUART8250 { | |
public: | |
- ArchUART8250(addr_t base, int64 clock); | |
+ ArchUART8250(addr_t base, int64 clock, | |
+ uint32 flags); | |
~ArchUART8250(); | |
void InitEarly(); | |
// ARM MMIO: on ARM the UART regs are aligned on 32bit | |
virtual void Out8(int reg, uint8 value); | |
virtual uint8 In8(int reg); | |
+ | |
+private: | |
+ uint32 fFlags; | |
}; | |
-ArchUART8250::ArchUART8250(addr_t base, int64 clock) | |
+ArchUART8250::ArchUART8250(addr_t base, int64 clock, uint32 flags) | |
: | |
- DebugUART8250(base, clock) | |
+ DebugUART8250(base, clock), | |
+ fFlags(flags) | |
{ | |
} | |
@@ -41,22 +47,22 @@ void | |
ArchUART8250::InitEarly() | |
{ | |
// Perform special hardware UART configuration | |
-#warning TODO: Detect OMAP3 from fdt! | |
-#if BOARD_CPU_OMAP3 | |
- /* UART1 */ | |
- RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1); | |
- RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1); | |
- | |
- /* UART2 */ | |
- RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1); | |
- RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1); | |
- | |
- /* UART3 */ | |
- RMWREG32(CM_FCLKEN_PER, 11, 1, 1); | |
- RMWREG32(CM_ICLKEN_PER, 11, 1, 1); | |
-#else | |
-#warning INTITIALIZE UART!!!!! | |
-#endif | |
+ | |
+ #if 0 | |
+ if ((fFlags & ARCH_8250_OMAP) != 0) { | |
+ /* UART1 */ | |
+ RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1); | |
+ RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1); | |
+ | |
+ /* UART2 */ | |
+ RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1); | |
+ RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1); | |
+ | |
+ /* UART3 */ | |
+ RMWREG32(CM_FCLKEN_PER, 11, 1, 1); | |
+ RMWREG32(CM_ICLKEN_PER, 11, 1, 1); | |
+ } | |
+ #endif | |
} | |
@@ -74,9 +80,9 @@ ArchUART8250::In8(int reg) | |
} | |
-DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock) | |
+DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock, uint32 flags) | |
{ | |
static char buffer[sizeof(ArchUART8250)]; | |
- ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock); | |
+ ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock, flags); | |
return uart; | |
} | |
diff --git a/src/system/kernel/arch/ppc/arch_uart_8250.cpp b/src/system/kernel/arch/ppc/arch_uart_8250.cpp | |
index 15894de3b2..8f67acb8e1 100644 | |
--- a/src/system/kernel/arch/ppc/arch_uart_8250.cpp | |
+++ b/src/system/kernel/arch/ppc/arch_uart_8250.cpp | |
@@ -11,15 +11,21 @@ | |
class ArchUART8250 : public DebugUART8250 { | |
public: | |
- ArchUART8250(addr_t base, int64 clock); | |
+ ArchUART8250(addr_t base, int64 clock, | |
+ uint32 flags); | |
~ArchUART8250(); | |
virtual void Barrier(); | |
+ | |
+private: | |
+ uint32 fFlags; | |
}; | |
-ArchUART8250::ArchUART8250(addr_t base, int64 clock) | |
- : DebugUART8250(base, clock) | |
+ArchUART8250::ArchUART8250(addr_t base, int64 clock, uint32 flags) | |
+ : | |
+ DebugUART8250(base, clock), | |
+ fFlags(flags) | |
{ | |
} | |
@@ -36,10 +42,10 @@ ArchUART8250::Barrier() | |
} | |
-DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock) | |
+DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock, uint32 flags) | |
{ | |
static char buffer[sizeof(ArchUART8250)]; | |
- ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock); | |
+ ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock, flags); | |
return uart; | |
} | |
diff --git a/src/system/kernel/platform/u-boot/fdt_serial.cpp b/src/system/kernel/platform/u-boot/fdt_serial.cpp | |
index 6842437633..b375293fc2 100644 | |
--- a/src/system/kernel/platform/u-boot/fdt_serial.cpp | |
+++ b/src/system/kernel/platform/u-boot/fdt_serial.cpp | |
@@ -18,6 +18,7 @@ | |
#include <arch/generic/debug_uart_8250.h> | |
#ifdef __ARM__ | |
+#include <arch/arm/arch_uart_8250.h> | |
#include <arch/arm/arch_uart_pl011.h> | |
#endif | |
@@ -99,9 +100,20 @@ debug_uart_from_fdt(const void *fdt) | |
if (fdt_node_check_compatible(fdt, node, "ns16550a") == 0 | |
|| fdt_node_check_compatible(fdt, node, "ns16550") == 0) { | |
- TRACE(("serial: Found 8250 serial UART!\n")); | |
- uart = arch_get_uart_8250(regs, clock); | |
+ TRACE(("serial: Found generic 8250 serial UART!\n")); | |
+ uart = arch_get_uart_8250(regs, clock, 0); | |
#ifdef __ARM__ | |
+ } else if (fdt_node_check_compatible(fdt, node, "snps,dw-apb-uart") == 0) { | |
+ TRACE(("serial: Found DW 8250 serial UART!\n")); | |
+ // XXX: DW | |
+ if (clock == 0) | |
+ clock = 3686400; | |
+ uart = arch_get_uart_8250(regs, clock, ARCH_8250_DW); | |
+ } else if (fdt_node_check_compatible(fdt, node, "ti,omap2-uart") == 0 | |
+ || fdt_node_check_compatible(fdt, node, "ti,omap3-uart") == 0 | |
+ || fdt_node_check_compatible(fdt, node, "ti,omap4-uart") == 0) { | |
+ TRACE(("serial: Found OMAP 8250 serial UART!\n")); | |
+ uart = arch_get_uart_8250(regs, clock, ARCH_8250_OMAP); | |
} else if (fdt_node_check_compatible(fdt, node, "arm,pl011") == 0 | |
|| fdt_node_check_compatible(fdt, node, "arm,primecell") == 0) { | |
TRACE(("serial: Found pl011 serial UART!\n")); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment