arm-trusted-firmware/plat/socionext/uniphier/uniphier_console_setup.c
Masahiro Yamada abfd571974 uniphier: set CONSOLE_FLAG_TRANSLATE_CRLF and clean up console driver
This console driver sends '\r' before 'n', not after.
It works, but the convention is "\r\n" (i.e. CRLF)

Instead of fixing it in the driver, set CONSOLE_FLAG_TRANSLATE_CRLF
to leave it to the framework.

Change-Id: I2154e29313739a40dff70cfb5c0f8989136d4ad2
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
2019-09-03 09:08:16 +00:00

88 lines
2.1 KiB
C

/*
* Copyright (c) 2019, Socionext Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <drivers/console.h>
#include <errno.h>
#include <lib/mmio.h>
#include <plat/common/platform.h>
#include "uniphier.h"
#include "uniphier_console.h"
#define UNIPHIER_UART_BASE 0x54006800
#define UNIPHIER_UART_END 0x54006c00
#define UNIPHIER_UART_OFFSET 0x100
struct uniphier_console {
struct console console;
uintptr_t base;
};
/* These callbacks are implemented in assembly to use crash_console_helpers.S */
int uniphier_console_putc(int character, struct console *console);
int uniphier_console_getc(struct console *console);
int uniphier_console_flush(struct console *console);
static struct uniphier_console uniphier_console = {
.console = {
.flags = CONSOLE_FLAG_BOOT |
#if DEBUG
CONSOLE_FLAG_RUNTIME |
#endif
CONSOLE_FLAG_CRASH |
CONSOLE_FLAG_TRANSLATE_CRLF,
.putc = uniphier_console_putc,
.getc = uniphier_console_getc,
.flush = uniphier_console_flush,
},
};
/*
* There are 4 UART ports available on this platform. By default, we want to
* use the same one as used in the previous firmware stage.
*/
static uintptr_t uniphier_console_get_base(void)
{
uintptr_t base = UNIPHIER_UART_BASE;
uint32_t div;
while (base < UNIPHIER_UART_END) {
div = mmio_read_32(base + UNIPHIER_UART_DLR);
if (div)
return base;
base += UNIPHIER_UART_OFFSET;
}
return 0;
}
static void uniphier_console_init(uintptr_t base)
{
mmio_write_32(base + UNIPHIER_UART_FCR, UNIPHIER_UART_FCR_ENABLE_FIFO);
mmio_write_32(base + UNIPHIER_UART_LCR_MCR,
UNIPHIER_UART_LCR_WLEN8 << 8);
}
void uniphier_console_setup(void)
{
uintptr_t base;
base = uniphier_console_get_base();
if (!base)
plat_error_handler(-EINVAL);
uniphier_console.base = base;
console_register(&uniphier_console.console);
/*
* The hardware might be still printing characters queued up in the
* previous firmware stage. Make sure the transmitter is empty before
* any initialization. Otherwise, the console might get corrupted.
*/
console_flush();
uniphier_console_init(base);
}