Skip to content

Instantly share code, notes, and snippets.

@kallisti5
Created November 17, 2017 22:29
Show Gist options
  • Save kallisti5/a2035e19469b19962c280d26da5f7b07 to your computer and use it in GitHub Desktop.
Save kallisti5/a2035e19469b19962c280d26da5f7b07 to your computer and use it in GitHub Desktop.
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