]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/blackfin/include/asm/serial.h
Merge branch 'u-boot-samsung/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / arch / blackfin / include / asm / serial.h
1 /*
2  * serial.h - common serial defines for early debug and serial driver.
3  *            any functions defined here must be always_inline since
4  *            initcode cannot have function calls.
5  *
6  * Copyright (c) 2004-2011 Analog Devices Inc.
7  *
8  * Licensed under the GPL-2 or later.
9  */
10
11 #ifndef __BFIN_CPU_SERIAL_H__
12 #define __BFIN_CPU_SERIAL_H__
13
14 #include <asm/blackfin.h>
15 #include <asm/portmux.h>
16
17 #ifndef CONFIG_UART_CONSOLE
18 # define CONFIG_UART_CONSOLE 0
19 #endif
20
21 #ifdef CONFIG_DEBUG_EARLY_SERIAL
22 # define BFIN_DEBUG_EARLY_SERIAL 1
23 #else
24 # define BFIN_DEBUG_EARLY_SERIAL 0
25 #endif
26
27 #if defined(__ADSPBF60x__)
28 # define BFIN_UART_HW_VER 4
29 #elif defined(__ADSPBF50x__) || defined(__ADSPBF54x__)
30 # define BFIN_UART_HW_VER 2
31 #else
32 # define BFIN_UART_HW_VER 1
33 #endif
34
35 #define __PASTE_UART(num, pfx, sfx) pfx##num##_##sfx
36 #define _PASTE_UART(num, pfx, sfx) __PASTE_UART(num, pfx, sfx)
37 #define _P_UART(n, pin) _PASTE_UART(n, P_UART, pin)
38 #define P_UART(pin) _P_UART(CONFIG_UART_CONSOLE, pin)
39
40 #define pUART ((volatile struct bfin_mmr_serial *)uart_base)
41
42 #ifndef __ASSEMBLY__
43 __attribute__((always_inline))
44 static inline void serial_do_portmux(void);
45 #endif
46
47 #if BFIN_UART_HW_VER < 4
48 # include "serial1.h"
49 #else
50 # include "serial4.h"
51 #endif
52
53 #ifndef __ASSEMBLY__
54
55 __attribute__((always_inline))
56 static inline void serial_do_portmux(void)
57 {
58         if (!BFIN_DEBUG_EARLY_SERIAL) {
59                 const unsigned short pins[] = { P_UART(RX), P_UART(TX), 0, };
60                 peripheral_request_list(pins, "bfin-uart");
61                 return;
62         }
63
64         serial_early_do_portmux();
65 }
66
67 #ifndef BFIN_IN_INITCODE
68 __attribute__((always_inline))
69 static inline void serial_early_puts(const char *s)
70 {
71         if (BFIN_DEBUG_EARLY_SERIAL) {
72                 serial_puts("Early: ");
73                 serial_puts(s);
74         }
75 }
76 #endif
77
78 #else
79
80 .macro serial_early_init
81 #if defined(CONFIG_DEBUG_EARLY_SERIAL) && !defined(CONFIG_UART_MEM)
82         call __serial_early_init;
83 #endif
84 .endm
85
86 .macro serial_early_set_baud
87 #if defined(CONFIG_DEBUG_EARLY_SERIAL) && !defined(CONFIG_UART_MEM)
88         R0.L = LO(CONFIG_BAUDRATE);
89         R0.H = HI(CONFIG_BAUDRATE);
90         call __serial_early_set_baud;
91 #endif
92 .endm
93
94 #if CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_BYPASS
95 #define update_serial_early_string_addr \
96         R1.L = _start; \
97         R1.H = _start; \
98         R0 = R0 - R1; \
99         R1.L = 0; \
100         R1.H = 0x2000; \
101         R0 = R0 + R1;
102 #else
103 #define update_serial_early_string_addr
104 #endif
105
106 /* Since we embed the string right into our .text section, we need
107  * to find its address.  We do this by getting our PC and adding 2
108  * bytes (which is the length of the jump instruction).  Then we
109  * pass this address to serial_puts().
110  */
111 #ifdef CONFIG_DEBUG_EARLY_SERIAL
112 # define serial_early_puts(str) \
113         .section .rodata; \
114         7: \
115         .ascii "Early:"; \
116         .ascii __FILE__; \
117         .ascii ": "; \
118         .ascii str; \
119         .asciz "\n"; \
120         .previous; \
121         R0.L = 7b; \
122         R0.H = 7b; \
123         update_serial_early_string_addr \
124         call _uart_early_puts;
125 #else
126 # define serial_early_puts(str)
127 #endif
128
129 #endif
130
131 #endif