Commit | Line | Data |
---|---|---|
7c6337e2 KH |
1 | /* |
2 | * Serial port stubs for kernel decompress status messages | |
3 | * | |
dc2eb76c CC |
4 | * Initially based on: |
5 | * arch/arm/plat-omap/include/mach/uncompress.h | |
6 | * | |
7 | * Original copyrights follow. | |
8 | * | |
9 | * Copyright (C) 2000 RidgeRun, Inc. | |
10 | * Author: Greg Lonnon <glonnon@ridgerun.com> | |
11 | * | |
12 | * Rewritten by: | |
13 | * Author: <source@mvista.com> | |
14 | * 2004 (c) MontaVista Software, Inc. | |
7c6337e2 KH |
15 | * |
16 | * This file is licensed under the terms of the GNU General Public License | |
17 | * version 2. This program is licensed "as is" without any warranty of any | |
18 | * kind, whether express or implied. | |
19 | */ | |
20 | ||
21 | #include <linux/types.h> | |
22 | #include <linux/serial_reg.h> | |
7c6337e2 | 23 | |
27428e39 MG |
24 | #include <asm/mach-types.h> |
25 | ||
dc2eb76c | 26 | #include <mach/serial.h> |
27428e39 | 27 | |
8ea0de4b | 28 | u32 *uart; |
27428e39 | 29 | |
7c6337e2 | 30 | /* PORT_16C550A, in polled non-fifo mode */ |
7c6337e2 KH |
31 | static void putc(char c) |
32 | { | |
7c6337e2 KH |
33 | while (!(uart[UART_LSR] & UART_LSR_THRE)) |
34 | barrier(); | |
35 | uart[UART_TX] = c; | |
36 | } | |
37 | ||
38 | static inline void flush(void) | |
39 | { | |
7c6337e2 KH |
40 | while (!(uart[UART_LSR] & UART_LSR_THRE)) |
41 | barrier(); | |
42 | } | |
43 | ||
dc2eb76c CC |
44 | static inline void set_uart_info(u32 phys, void * __iomem virt) |
45 | { | |
e020fe34 NP |
46 | /* |
47 | * Get address of some.bss variable and round it down | |
48 | * a la CONFIG_AUTO_ZRELADDR. | |
49 | */ | |
50 | u32 ram_start = (u32)&uart & 0xf8000000; | |
51 | u32 *uart_info = (u32 *)(ram_start + DAVINCI_UART_INFO_OFS); | |
8ea0de4b | 52 | |
dc2eb76c CC |
53 | uart = (u32 *)phys; |
54 | uart_info[0] = phys; | |
55 | uart_info[1] = (u32)virt; | |
56 | } | |
57 | ||
58 | #define _DEBUG_LL_ENTRY(machine, phys, virt) \ | |
59 | if (machine_is_##machine()) { \ | |
60 | set_uart_info(phys, virt); \ | |
61 | break; \ | |
62 | } | |
63 | ||
64 | #define DEBUG_LL_DAVINCI(machine, port) \ | |
65 | _DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE, \ | |
66 | IO_ADDRESS(DAVINCI_UART##port##_BASE)) | |
67 | ||
68 | #define DEBUG_LL_DA8XX(machine, port) \ | |
69 | _DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE, \ | |
70 | IO_ADDRESS(DA8XX_UART##port##_BASE)) | |
71 | ||
38db050e CC |
72 | #define DEBUG_LL_TNETV107X(machine, port) \ |
73 | _DEBUG_LL_ENTRY(machine, TNETV107X_UART##port##_BASE, \ | |
74 | TNETV107X_UART##port##_VIRT) | |
75 | ||
dc2eb76c CC |
76 | static inline void __arch_decomp_setup(unsigned long arch_id) |
77 | { | |
78 | /* | |
79 | * Initialize the port based on the machine ID from the bootloader. | |
80 | * Note that we're using macros here instead of switch statement | |
81 | * as machine_is functions are optimized out for the boards that | |
82 | * are not selected. | |
83 | */ | |
84 | do { | |
85 | /* Davinci boards */ | |
86 | DEBUG_LL_DAVINCI(davinci_evm, 0); | |
87 | DEBUG_LL_DAVINCI(sffsdr, 0); | |
88 | DEBUG_LL_DAVINCI(neuros_osd2, 0); | |
89 | DEBUG_LL_DAVINCI(davinci_dm355_evm, 0); | |
90 | DEBUG_LL_DAVINCI(dm355_leopard, 0); | |
91 | DEBUG_LL_DAVINCI(davinci_dm6467_evm, 0); | |
92 | DEBUG_LL_DAVINCI(davinci_dm365_evm, 0); | |
93 | ||
94 | /* DA8xx boards */ | |
95 | DEBUG_LL_DA8XX(davinci_da830_evm, 2); | |
96 | DEBUG_LL_DA8XX(davinci_da850_evm, 2); | |
f2dbb6d9 | 97 | DEBUG_LL_DA8XX(mityomapl138, 1); |
6c18c91b | 98 | DEBUG_LL_DA8XX(omapl138_hawkboard, 2); |
38db050e CC |
99 | |
100 | /* TNETV107x boards */ | |
101 | DEBUG_LL_TNETV107X(tnetv107x, 1); | |
dc2eb76c CC |
102 | } while (0); |
103 | } | |
104 | ||
105 | #define arch_decomp_setup() __arch_decomp_setup(arch_id) | |
7c6337e2 | 106 | #define arch_decomp_wdog() |