Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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"));
Add Comment
Please, Sign In to add comment