xref: /arm-trusted-firmware/plat/socionext/uniphier/uniphier_console.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <asm_macros.S>
8*91f16700Schasinglulu#include <drivers/console.h>
9*91f16700Schasinglulu
10*91f16700Schasinglulu#include "uniphier_console.h"
11*91f16700Schasinglulu
12*91f16700Schasinglulu/*
13*91f16700Schasinglulu * In: w0 - character to be printed
14*91f16700Schasinglulu *     x1 - pointer to console structure
15*91f16700Schasinglulu * Out: return the character written (always succeeds)
16*91f16700Schasinglulu * Clobber: x2
17*91f16700Schasinglulu */
18*91f16700Schasinglulu	.globl	uniphier_console_putc
19*91f16700Schasinglulufunc uniphier_console_putc
20*91f16700Schasinglulu	ldr	x1, [x1, #CONSOLE_T_BASE]
21*91f16700Schasinglulu
22*91f16700Schasinglulu	/* Wait until the transmitter FIFO gets empty */
23*91f16700Schasinglulu0:	ldr	w2, [x1, #UNIPHIER_UART_LSR]
24*91f16700Schasinglulu	tbz	w2, #UNIPHIER_UART_LSR_THRE_BIT, 0b
25*91f16700Schasinglulu
26*91f16700Schasinglulu	str	w0, [x1, #UNIPHIER_UART_TX]
27*91f16700Schasinglulu
28*91f16700Schasinglulu	ret
29*91f16700Schasingluluendfunc uniphier_console_putc
30*91f16700Schasinglulu
31*91f16700Schasinglulu/*
32*91f16700Schasinglulu * In: x0 - pointer to console structure
33*91f16700Schasinglulu * Out: return the character read, or ERROR_NO_PENDING_CHAR if no character
34*91f16700Schasinglulu	is available
35*91f16700Schasinglulu * Clobber: x1
36*91f16700Schasinglulu */
37*91f16700Schasinglulu	.globl	uniphier_console_getc
38*91f16700Schasinglulufunc uniphier_console_getc
39*91f16700Schasinglulu	ldr	x0, [x0, #CONSOLE_T_BASE]
40*91f16700Schasinglulu
41*91f16700Schasinglulu	ldr	w1, [x0, #UNIPHIER_UART_LSR]
42*91f16700Schasinglulu	tbz	w1, #UNIPHIER_UART_LSR_DR_BIT, 0f
43*91f16700Schasinglulu
44*91f16700Schasinglulu	ldr	w0, [x0, #UNIPHIER_UART_RX]
45*91f16700Schasinglulu	ret
46*91f16700Schasinglulu
47*91f16700Schasinglulu0:	mov	w0, #ERROR_NO_PENDING_CHAR
48*91f16700Schasinglulu	ret
49*91f16700Schasingluluendfunc uniphier_console_getc
50*91f16700Schasinglulu
51*91f16700Schasinglulu/*
52*91f16700Schasinglulu * In: x0 - pointer to console structure
53*91f16700Schasinglulu * Out: return 0 (always succeeds)
54*91f16700Schasinglulu * Clobber: x1
55*91f16700Schasinglulu */
56*91f16700Schasinglulu	.global uniphier_console_flush
57*91f16700Schasinglulufunc uniphier_console_flush
58*91f16700Schasinglulu	ldr	x0, [x0, #CONSOLE_T_BASE]
59*91f16700Schasinglulu
60*91f16700Schasinglulu	/* wait until the transmitter gets empty */
61*91f16700Schasinglulu0:	ldr	w1, [x0, #UNIPHIER_UART_LSR]
62*91f16700Schasinglulu	tbz	w1, #UNIPHIER_UART_LSR_TEMT_BIT, 0b
63*91f16700Schasinglulu
64*91f16700Schasinglulu	ret
65*91f16700Schasingluluendfunc uniphier_console_flush
66