1/*
2 * Copyright 2011-2012 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		François Revol, revol@free.fr
7 */
8
9
10#include <arch/arm/reg.h>
11#include <arch/generic/debug_uart_8250.h>
12#include <board_config.h>
13#include <debug.h>
14#include <new>
15
16
17class ArchUART8250 : public DebugUART8250 {
18public:
19							ArchUART8250(addr_t base, int64 clock);
20							~ArchUART8250();
21	void					InitEarly();
22
23	// ARM MMIO: on ARM the UART regs are aligned on 32bit
24	virtual void			Out8(int reg, uint8 value);
25	virtual uint8			In8(int reg);
26};
27
28
29ArchUART8250::ArchUART8250(addr_t base, int64 clock)
30	: DebugUART8250(base, clock)
31{
32}
33
34
35ArchUART8250::~ArchUART8250()
36{
37}
38
39
40void
41ArchUART8250::InitEarly()
42{
43	// Perform special hardware UART configuration
44
45#if BOARD_CPU_OMAP3
46	/* UART1 */
47	RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1);
48	RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1);
49
50	/* UART2 */
51	RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1);
52	RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1);
53
54	/* UART3 */
55	RMWREG32(CM_FCLKEN_PER, 11, 1, 1);
56	RMWREG32(CM_ICLKEN_PER, 11, 1, 1);
57#else
58#warning INTITIALIZE UART!!!!!
59#endif
60}
61
62
63void
64ArchUART8250::Out8(int reg, uint8 value)
65{
66	*((uint8 *)Base() + reg * sizeof(uint32)) = value;
67}
68
69
70uint8
71ArchUART8250::In8(int reg)
72{
73	return *((uint8 *)Base() + reg * sizeof(uint32));
74}
75
76
77DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock)
78{
79	static char buffer[sizeof(ArchUART8250)];
80	ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock);
81	return uart;
82}
83