xref: /rk3399_ARM-atf/plat/imx/common/lpuart_console.S (revision f1ac79642e0f9a2320f95a8e53042be625a989e0)
127b9d5eaSAnson Huang/*
2*f1ac7964SAnson Huang * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
327b9d5eaSAnson Huang *
427b9d5eaSAnson Huang * SPDX-License-Identifier: BSD-3-Clause
527b9d5eaSAnson Huang */
627b9d5eaSAnson Huang
727b9d5eaSAnson Huang#include <arch.h>
827b9d5eaSAnson Huang#include <asm_macros.S>
9cc5859caSSoby Mathew#define USE_FINISH_CONSOLE_REG_2
1027b9d5eaSAnson Huang#include <console_macros.S>
1127b9d5eaSAnson Huang#include <assert_macros.S>
1227b9d5eaSAnson Huang#include "imx8_lpuart.h"
1327b9d5eaSAnson Huang
1427b9d5eaSAnson Huang	.globl	console_lpuart_register
1527b9d5eaSAnson Huang	.globl	console_lpuart_init
1627b9d5eaSAnson Huang	.globl	console_lpuart_putc
1727b9d5eaSAnson Huang	.globl	console_lpuart_getc
18*f1ac7964SAnson Huang	.globl	console_lpuart_flush
1927b9d5eaSAnson Huang
2027b9d5eaSAnson Huangfunc console_lpuart_register
2127b9d5eaSAnson Huang	mov	x7, x30
2227b9d5eaSAnson Huang	mov	x6, x3
2327b9d5eaSAnson Huang	cbz	x6, register_fail
2427b9d5eaSAnson Huang	str	x0, [x6, #CONSOLE_T_DRVDATA]
2527b9d5eaSAnson Huang
2627b9d5eaSAnson Huang	bl	console_lpuart_init
2727b9d5eaSAnson Huang	cbz	x0, register_fail
2827b9d5eaSAnson Huang
2927b9d5eaSAnson Huang	mov	x0, x6
3027b9d5eaSAnson Huang	mov	x30, x7
31*f1ac7964SAnson Huang	finish_console_register lpuart putc=1, getc=1, flush=1
3227b9d5eaSAnson Huang
3327b9d5eaSAnson Huangregister_fail:
3427b9d5eaSAnson Huang	ret	x7
3527b9d5eaSAnson Huangendfunc console_lpuart_register
3627b9d5eaSAnson Huang
3727b9d5eaSAnson Huangfunc console_lpuart_init
3827b9d5eaSAnson Huang	mov	w0, #1
3927b9d5eaSAnson Huang	ret
4027b9d5eaSAnson Huangendfunc console_lpuart_init
4127b9d5eaSAnson Huang
4227b9d5eaSAnson Huangfunc console_lpuart_putc
4327b9d5eaSAnson Huang	ldr	x1, [x1, #CONSOLE_T_DRVDATA]
4427b9d5eaSAnson Huang	cbz	x1, putc_error
4527b9d5eaSAnson Huang	/* Prepare '\r' to '\n' */
4627b9d5eaSAnson Huang	cmp	w0, #0xA
4727b9d5eaSAnson Huang	b.ne	2f
4827b9d5eaSAnson Huang1:
4927b9d5eaSAnson Huang	/* Check if the transmit FIFO is full */
5027b9d5eaSAnson Huang	ldr	w2, [x1, #STAT]
5127b9d5eaSAnson Huang	tbz	w2, #23, 1b
5227b9d5eaSAnson Huang	mov	w2, #0xD
5327b9d5eaSAnson Huang	str	w2, [x1, #DATA]
5427b9d5eaSAnson Huang2:
5527b9d5eaSAnson Huang	/* Check if the transmit FIFO is full */
5627b9d5eaSAnson Huang	ldr	w2, [x1, #STAT]
5727b9d5eaSAnson Huang	tbz	w2, #23, 2b
5827b9d5eaSAnson Huang	str	w0, [x1, #DATA]
5927b9d5eaSAnson Huang	ret
6027b9d5eaSAnson Huangputc_error:
6127b9d5eaSAnson Huang	mov	w0, #-1
6227b9d5eaSAnson Huang	ret
6327b9d5eaSAnson Huangendfunc console_lpuart_putc
6427b9d5eaSAnson Huang
6527b9d5eaSAnson Huangfunc console_lpuart_getc
6627b9d5eaSAnson Huang	ldr	x0, [x0, #CONSOLE_T_DRVDATA]
6727b9d5eaSAnson Huang	cbz	x0, getc_error
6827b9d5eaSAnson Huang	/* Check if the receive FIFO state */
6927b9d5eaSAnson Huang	ret
7027b9d5eaSAnson Huanggetc_error:
7127b9d5eaSAnson Huang	mov	w0, #-1
7227b9d5eaSAnson Huang	ret
7327b9d5eaSAnson Huangendfunc console_lpuart_getc
74*f1ac7964SAnson Huang
75*f1ac7964SAnson Huangfunc console_lpuart_flush
76*f1ac7964SAnson Huang	mov	x0, #0
77*f1ac7964SAnson Huang	ret
78*f1ac7964SAnson Huangendfunc console_lpuart_flush
79