xref: /aosp_15_r20/external/arm-trusted-firmware/plat/imx/common/lpuart_console.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2015-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 <arch.h>
8*54fd6939SJiyong Park#include <asm_macros.S>
9*54fd6939SJiyong Park#include <console_macros.S>
10*54fd6939SJiyong Park#include <assert_macros.S>
11*54fd6939SJiyong Park#include "imx8_lpuart.h"
12*54fd6939SJiyong Park
13*54fd6939SJiyong Park	.globl	console_lpuart_register
14*54fd6939SJiyong Park	.globl	console_lpuart_init
15*54fd6939SJiyong Park	.globl	console_lpuart_putc
16*54fd6939SJiyong Park	.globl	console_lpuart_getc
17*54fd6939SJiyong Park	.globl	console_lpuart_flush
18*54fd6939SJiyong Park
19*54fd6939SJiyong Parkfunc console_lpuart_register
20*54fd6939SJiyong Park	mov	x7, x30
21*54fd6939SJiyong Park	mov	x6, x3
22*54fd6939SJiyong Park	cbz	x6, register_fail
23*54fd6939SJiyong Park	str	x0, [x6, #CONSOLE_T_BASE]
24*54fd6939SJiyong Park
25*54fd6939SJiyong Park	bl	console_lpuart_init
26*54fd6939SJiyong Park	cbz	x0, register_fail
27*54fd6939SJiyong Park
28*54fd6939SJiyong Park	mov	x0, x6
29*54fd6939SJiyong Park	mov	x30, x7
30*54fd6939SJiyong Park	finish_console_register lpuart putc=1, getc=1, flush=1
31*54fd6939SJiyong Park
32*54fd6939SJiyong Parkregister_fail:
33*54fd6939SJiyong Park	ret	x7
34*54fd6939SJiyong Parkendfunc console_lpuart_register
35*54fd6939SJiyong Park
36*54fd6939SJiyong Parkfunc console_lpuart_init
37*54fd6939SJiyong Park	mov	w0, #1
38*54fd6939SJiyong Park	ret
39*54fd6939SJiyong Parkendfunc console_lpuart_init
40*54fd6939SJiyong Park
41*54fd6939SJiyong Parkfunc console_lpuart_putc
42*54fd6939SJiyong Park	ldr	x1, [x1, #CONSOLE_T_BASE]
43*54fd6939SJiyong Park	cbz	x1, putc_error
44*54fd6939SJiyong Park	/* Prepare '\r' to '\n' */
45*54fd6939SJiyong Park	cmp	w0, #0xA
46*54fd6939SJiyong Park	b.ne	2f
47*54fd6939SJiyong Park1:
48*54fd6939SJiyong Park	/* Check if the transmit FIFO is full */
49*54fd6939SJiyong Park	ldr	w2, [x1, #STAT]
50*54fd6939SJiyong Park	tbz	w2, #23, 1b
51*54fd6939SJiyong Park	mov	w2, #0xD
52*54fd6939SJiyong Park	str	w2, [x1, #DATA]
53*54fd6939SJiyong Park2:
54*54fd6939SJiyong Park	/* Check if the transmit FIFO is full */
55*54fd6939SJiyong Park	ldr	w2, [x1, #STAT]
56*54fd6939SJiyong Park	tbz	w2, #23, 2b
57*54fd6939SJiyong Park	str	w0, [x1, #DATA]
58*54fd6939SJiyong Park	ret
59*54fd6939SJiyong Parkputc_error:
60*54fd6939SJiyong Park	mov	w0, #-1
61*54fd6939SJiyong Park	ret
62*54fd6939SJiyong Parkendfunc console_lpuart_putc
63*54fd6939SJiyong Park
64*54fd6939SJiyong Parkfunc console_lpuart_getc
65*54fd6939SJiyong Park	ldr	x0, [x0, #CONSOLE_T_BASE]
66*54fd6939SJiyong Park	cbz	x0, getc_error
67*54fd6939SJiyong Park	/* Check if the receive FIFO state */
68*54fd6939SJiyong Park	ret
69*54fd6939SJiyong Parkgetc_error:
70*54fd6939SJiyong Park	mov	w0, #-1
71*54fd6939SJiyong Park	ret
72*54fd6939SJiyong Parkendfunc console_lpuart_getc
73*54fd6939SJiyong Park
74*54fd6939SJiyong Parkfunc console_lpuart_flush
75*54fd6939SJiyong Park	ret
76*54fd6939SJiyong Parkendfunc console_lpuart_flush
77