diff options
Diffstat (limited to 'arch/mips/boot/compressed/uart-16550.c')
-rw-r--r-- | arch/mips/boot/compressed/uart-16550.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/arch/mips/boot/compressed/uart-16550.c b/arch/mips/boot/compressed/uart-16550.c new file mode 100644 index 000000000..aee8d7b8f --- /dev/null +++ b/arch/mips/boot/compressed/uart-16550.c | |||
@@ -0,0 +1,64 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* | ||
3 | * 16550 compatible uart based serial debug support for zboot | ||
4 | */ | ||
5 | |||
6 | #include <linux/types.h> | ||
7 | #include <linux/serial_reg.h> | ||
8 | |||
9 | #include <asm/addrspace.h> | ||
10 | |||
11 | #if defined(CONFIG_MACH_LOONGSON64) || defined(CONFIG_MIPS_MALTA) | ||
12 | #define UART_BASE 0x1fd003f8 | ||
13 | #define PORT(offset) (CKSEG1ADDR(UART_BASE) + (offset)) | ||
14 | #endif | ||
15 | |||
16 | #ifdef CONFIG_AR7 | ||
17 | #include <ar7.h> | ||
18 | #define PORT(offset) (CKSEG1ADDR(AR7_REGS_UART0) + (4 * offset)) | ||
19 | #endif | ||
20 | |||
21 | #ifdef CONFIG_MACH_INGENIC | ||
22 | #define INGENIC_UART0_BASE_ADDR 0x10030000 | ||
23 | #define PORT(offset) (CKSEG1ADDR(INGENIC_UART0_BASE_ADDR) + (4 * offset)) | ||
24 | #endif | ||
25 | |||
26 | #ifdef CONFIG_CPU_XLR | ||
27 | #define UART0_BASE 0x1EF14000 | ||
28 | #define PORT(offset) (CKSEG1ADDR(UART0_BASE) + (4 * offset)) | ||
29 | #define IOTYPE unsigned int | ||
30 | #endif | ||
31 | |||
32 | #ifdef CONFIG_CPU_XLP | ||
33 | #define UART0_BASE 0x18030100 | ||
34 | #define PORT(offset) (CKSEG1ADDR(UART0_BASE) + (4 * offset)) | ||
35 | #define IOTYPE unsigned int | ||
36 | #endif | ||
37 | |||
38 | #ifndef IOTYPE | ||
39 | #define IOTYPE char | ||
40 | #endif | ||
41 | |||
42 | #ifndef PORT | ||
43 | #error please define the serial port address for your own machine | ||
44 | #endif | ||
45 | |||
46 | static inline unsigned int serial_in(int offset) | ||
47 | { | ||
48 | return *((volatile IOTYPE *)PORT(offset)) & 0xFF; | ||
49 | } | ||
50 | |||
51 | static inline void serial_out(int offset, int value) | ||
52 | { | ||
53 | *((volatile IOTYPE *)PORT(offset)) = value & 0xFF; | ||
54 | } | ||
55 | |||
56 | void putc(char c) | ||
57 | { | ||
58 | int timeout = 1000000; | ||
59 | |||
60 | while (((serial_in(UART_LSR) & UART_LSR_THRE) == 0) && (timeout-- > 0)) | ||
61 | ; | ||
62 | |||
63 | serial_out(UART_TX, c); | ||
64 | } | ||