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