Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 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 | * |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 6 | * Copyright (c) 2004-2011 Analog Devices Inc. |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 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> |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 15 | #include <asm/portmux.h> |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 16 | |
Mike Frysinger | 500f2bb | 2008-10-11 21:52:17 -0400 | [diff] [blame] | 17 | #ifndef CONFIG_UART_CONSOLE |
| 18 | # define CONFIG_UART_CONSOLE 0 |
| 19 | #endif |
| 20 | |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 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 | |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 27 | #if defined(__ADSPBF60x__) |
| 28 | # define BFIN_UART_HW_VER 4 |
| 29 | #elif defined(__ADSPBF50x__) || defined(__ADSPBF54x__) |
Mike Frysinger | 134db0d | 2010-12-17 15:25:09 -0500 | [diff] [blame] | 30 | # define BFIN_UART_HW_VER 2 |
| 31 | #else |
| 32 | # define BFIN_UART_HW_VER 1 |
| 33 | #endif |
Mike Frysinger | 3b7ed5a | 2009-11-12 18:42:53 -0500 | [diff] [blame] | 34 | |
Mike Frysinger | fbd8ae4 | 2010-12-17 16:23:59 -0500 | [diff] [blame] | 35 | #define __PASTE_UART(num, pfx, sfx) pfx##num##_##sfx |
| 36 | #define _PASTE_UART(num, pfx, sfx) __PASTE_UART(num, pfx, sfx) |
Mike Frysinger | 53ba322 | 2011-04-29 23:23:28 -0400 | [diff] [blame] | 37 | #define _P_UART(n, pin) _PASTE_UART(n, P_UART, pin) |
| 38 | #define P_UART(pin) _P_UART(CONFIG_UART_CONSOLE, pin) |
Mike Frysinger | fbd8ae4 | 2010-12-17 16:23:59 -0500 | [diff] [blame] | 39 | |
Mike Frysinger | 53ba322 | 2011-04-29 23:23:28 -0400 | [diff] [blame] | 40 | #define pUART ((volatile struct bfin_mmr_serial *)uart_base) |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 41 | |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 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" |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 49 | #else |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 50 | # include "serial4.h" |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 51 | #endif |
| 52 | |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 53 | #ifndef __ASSEMBLY__ |
| 54 | |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 55 | __attribute__((always_inline)) |
| 56 | static inline void serial_do_portmux(void) |
| 57 | { |
Mike Frysinger | 946550d | 2010-06-02 06:00:27 -0400 | [diff] [blame] | 58 | if (!BFIN_DEBUG_EARLY_SERIAL) { |
Mike Frysinger | fbd8ae4 | 2010-12-17 16:23:59 -0500 | [diff] [blame] | 59 | const unsigned short pins[] = { P_UART(RX), P_UART(TX), 0, }; |
Mike Frysinger | 946550d | 2010-06-02 06:00:27 -0400 | [diff] [blame] | 60 | peripheral_request_list(pins, "bfin-uart"); |
| 61 | return; |
| 62 | } |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 63 | |
Sonic Zhang | 7a91b9b | 2012-08-16 11:16:02 +0800 | [diff] [blame^] | 64 | serial_early_do_portmux(); |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 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 | #ifdef CONFIG_DEBUG_EARLY_SERIAL |
| 82 | call _serial_initialize; |
| 83 | #endif |
| 84 | .endm |
| 85 | |
| 86 | .macro serial_early_set_baud |
| 87 | #ifdef CONFIG_DEBUG_EARLY_SERIAL |
| 88 | R0.L = LO(CONFIG_BAUDRATE); |
| 89 | R0.H = HI(CONFIG_BAUDRATE); |
| 90 | call _serial_set_baud; |
| 91 | #endif |
| 92 | .endm |
| 93 | |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 94 | /* Since we embed the string right into our .text section, we need |
| 95 | * to find its address. We do this by getting our PC and adding 2 |
| 96 | * bytes (which is the length of the jump instruction). Then we |
| 97 | * pass this address to serial_puts(). |
| 98 | */ |
| 99 | #ifdef CONFIG_DEBUG_EARLY_SERIAL |
| 100 | # define serial_early_puts(str) \ |
Mike Frysinger | 2426099 | 2011-06-29 16:21:28 -0400 | [diff] [blame] | 101 | .section .rodata; \ |
| 102 | 7: \ |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 103 | .ascii "Early:"; \ |
| 104 | .ascii __FILE__; \ |
| 105 | .ascii ": "; \ |
| 106 | .ascii str; \ |
| 107 | .asciz "\n"; \ |
Mike Frysinger | 2426099 | 2011-06-29 16:21:28 -0400 | [diff] [blame] | 108 | .previous; \ |
| 109 | R0.L = 7b; \ |
| 110 | R0.H = 7b; \ |
Mike Frysinger | 94bae5c | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 111 | call _serial_puts; |
| 112 | #else |
| 113 | # define serial_early_puts(str) |
| 114 | #endif |
| 115 | |
| 116 | #endif |
| 117 | |
| 118 | #endif |