[ARM] 4660/3: at91: allow selecting UART for early kernel messages

Currently early kernel messages, i.e., those from uncompression, go to the
debugging UART. And if it is enabled in the platform configuration, but
not initialized by the bootloader, the machine hangs, waiting for UART
status change. Besides, having those messages on another UART - typically
the console UART - may be preferrable. This patch allows selecting the
UART in kernel configuration.

Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
Acked-by: Andrew Victor <linux@maxim.org.za>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by Guennadi Liakhovetski and committed by Russell King fa3218d8 e83aff58

+81 -11
+30
arch/arm/mach-at91/Kconfig
··· 253 253 system clock (of at least several MHz), rounding is less of a 254 254 problem so it can be safer to use a decimal values like 100. 255 255 256 + choice 257 + prompt "Select a UART for early kernel messages" 258 + 259 + config AT91_EARLY_DBGU 260 + bool "DBGU" 261 + 262 + config AT91_EARLY_USART0 263 + bool "USART0" 264 + 265 + config AT91_EARLY_USART1 266 + bool "USART1" 267 + 268 + config AT91_EARLY_USART2 269 + bool "USART2" 270 + depends on ! ARCH_AT91X40 271 + 272 + config AT91_EARLY_USART3 273 + bool "USART3" 274 + depends on (ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9260) 275 + 276 + config AT91_EARLY_USART4 277 + bool "USART4" 278 + depends on ARCH_AT91SAM9260 279 + 280 + config AT91_EARLY_USART5 281 + bool "USART5" 282 + depends on ARCH_AT91SAM9260 283 + 284 + endchoice 285 + 256 286 endmenu 257 287 258 288 endif
+1 -2
drivers/serial/atmel_serial.c
··· 34 34 #include <linux/tty_flip.h> 35 35 #include <linux/platform_device.h> 36 36 #include <linux/atmel_pdc.h> 37 + #include <linux/atmel_serial.h> 37 38 38 39 #include <asm/io.h> 39 40 ··· 45 44 #include <asm/arch/cpu.h> 46 45 #include <asm/arch/gpio.h> 47 46 #endif 48 - 49 - #include "atmel_serial.h" 50 47 51 48 #if defined(CONFIG_SERIAL_ATMEL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) 52 49 #define SUPPORT_SYSRQ
+1 -1
drivers/serial/atmel_serial.h include/linux/atmel_serial.h
··· 1 1 /* 2 - * drivers/serial/atmel_serial.h 2 + * include/linux/atmel_serial.h 3 3 * 4 4 * Copyright (C) 2005 Ivan Kokshaysky 5 5 * Copyright (C) SAN People
+5
include/asm-arm/arch-at91/at91rm9200.h
··· 93 93 #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) /* Real-Time Clock */ 94 94 #define AT91_MC (0xffffff00 - AT91_BASE_SYS) /* Memory Controllers */ 95 95 96 + #define AT91_USART0 AT91RM9200_BASE_US0 97 + #define AT91_USART1 AT91RM9200_BASE_US1 98 + #define AT91_USART2 AT91RM9200_BASE_US2 99 + #define AT91_USART3 AT91RM9200_BASE_US3 100 + 96 101 #define AT91_MATRIX 0 /* not supported */ 97 102 98 103 /*
+7
include/asm-arm/arch-at91/at91sam9260.h
··· 99 99 #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) 100 100 #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) 101 101 102 + #define AT91_USART0 AT91SAM9260_BASE_US0 103 + #define AT91_USART1 AT91SAM9260_BASE_US1 104 + #define AT91_USART2 AT91SAM9260_BASE_US2 105 + #define AT91_USART3 AT91SAM9260_BASE_US3 106 + #define AT91_USART4 AT91SAM9260_BASE_US4 107 + #define AT91_USART5 AT91SAM9260_BASE_US5 108 + 102 109 103 110 /* 104 111 * Internal Memory.
+4
include/asm-arm/arch-at91/at91sam9261.h
··· 84 84 #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) 85 85 #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) 86 86 87 + #define AT91_USART0 AT91SAM9261_BASE_US0 88 + #define AT91_USART1 AT91SAM9261_BASE_US1 89 + #define AT91_USART2 AT91SAM9261_BASE_US2 90 + 87 91 88 92 /* 89 93 * Internal Memory.
+4
include/asm-arm/arch-at91/at91sam9263.h
··· 101 101 #define AT91_RTT1 (0xfffffd50 - AT91_BASE_SYS) 102 102 #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) 103 103 104 + #define AT91_USART0 AT91SAM9263_BASE_US0 105 + #define AT91_USART1 AT91SAM9263_BASE_US1 106 + #define AT91_USART2 AT91SAM9263_BASE_US2 107 + 104 108 #define AT91_SMC AT91_SMC0 105 109 106 110 /*
+5
include/asm-arm/arch-at91/at91sam9rl.h
··· 94 94 #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) 95 95 #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) 96 96 97 + #define AT91_USART0 AT91SAM9RL_BASE_US0 98 + #define AT91_USART1 AT91SAM9RL_BASE_US1 99 + #define AT91_USART2 AT91SAM9RL_BASE_US2 100 + #define AT91_USART3 AT91SAM9RL_BASE_US3 101 + 97 102 98 103 /* 99 104 * Internal Memory.
+24 -8
include/asm-arm/arch-at91/uncompress.h
··· 22 22 #define __ASM_ARCH_UNCOMPRESS_H 23 23 24 24 #include <asm/io.h> 25 - #include <asm/arch/at91_dbgu.h> 25 + #include <linux/atmel_serial.h> 26 + 27 + #if defined(CONFIG_AT91_EARLY_DBGU) 28 + #define UART_OFFSET (AT91_DBGU + AT91_BASE_SYS) 29 + #elif defined(CONFIG_AT91_EARLY_USART0) 30 + #define UART_OFFSET AT91_USART0 31 + #elif defined(CONFIG_AT91_EARLY_USART1) 32 + #define UART_OFFSET AT91_USART1 33 + #elif defined(CONFIG_AT91_EARLY_USART2) 34 + #define UART_OFFSET AT91_USART2 35 + #elif defined(CONFIG_AT91_EARLY_USART3) 36 + #define UART_OFFSET AT91_USART3 37 + #elif defined(CONFIG_AT91_EARLY_USART4) 38 + #define UART_OFFSET AT91_USART4 39 + #elif defined(CONFIG_AT91_EARLY_USART5) 40 + #define UART_OFFSET AT91_USART5 41 + #endif 26 42 27 43 /* 28 44 * The following code assumes the serial port has already been ··· 49 33 */ 50 34 static void putc(int c) 51 35 { 52 - #ifdef AT91_DBGU 53 - void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ 36 + #ifdef UART_OFFSET 37 + void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */ 54 38 55 - while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) 39 + while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXRDY)) 56 40 barrier(); 57 - __raw_writel(c, sys + AT91_DBGU_THR); 41 + __raw_writel(c, sys + ATMEL_US_THR); 58 42 #endif 59 43 } 60 44 61 45 static inline void flush(void) 62 46 { 63 - #ifdef AT91_DBGU 64 - void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ 47 + #ifdef UART_OFFSET 48 + void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */ 65 49 66 50 /* wait for transmission to complete */ 67 - while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY)) 51 + while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXEMPTY)) 68 52 barrier(); 69 53 #endif 70 54 }