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