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