1*1537d62eSAijun Sun /* 2*1537d62eSAijun Sun * Copyright (c) 2016, Spreadtrum Communications Inc. 3*1537d62eSAijun Sun * All rights reserved. 4*1537d62eSAijun Sun * 5*1537d62eSAijun Sun * Redistribution and use in source and binary forms, with or without 6*1537d62eSAijun Sun * modification, are permitted provided that the following conditions are met: 7*1537d62eSAijun Sun * 8*1537d62eSAijun Sun * 1. Redistributions of source code must retain the above copyright notice, 9*1537d62eSAijun Sun * this list of conditions and the following disclaimer. 10*1537d62eSAijun Sun * 11*1537d62eSAijun Sun * 2. Redistributions in binary form must reproduce the above copyright notice, 12*1537d62eSAijun Sun * this list of conditions and the following disclaimer in the documentation 13*1537d62eSAijun Sun * and/or other materials provided with the distribution. 14*1537d62eSAijun Sun * 15*1537d62eSAijun Sun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16*1537d62eSAijun Sun * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*1537d62eSAijun Sun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*1537d62eSAijun Sun * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19*1537d62eSAijun Sun * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20*1537d62eSAijun Sun * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21*1537d62eSAijun Sun * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22*1537d62eSAijun Sun * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*1537d62eSAijun Sun * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24*1537d62eSAijun Sun * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*1537d62eSAijun Sun * POSSIBILITY OF SUCH DAMAGE. 26*1537d62eSAijun Sun */ 27*1537d62eSAijun Sun #include <io.h> 28*1537d62eSAijun Sun #include <drivers/sprd_uart.h> 29*1537d62eSAijun Sun 30*1537d62eSAijun Sun /* Register definitions */ 31*1537d62eSAijun Sun #define UART_TXD 0x0000 32*1537d62eSAijun Sun #define UART_RXD 0x0004 33*1537d62eSAijun Sun #define UART_STS1 0x000C /* data number in TX and RX fifo */ 34*1537d62eSAijun Sun 35*1537d62eSAijun Sun /* Register Bit Fields*/ 36*1537d62eSAijun Sun #define STS1_RXF_CNT_MASK 0x00ff /* Rx FIFO data counter mask */ 37*1537d62eSAijun Sun #define STS1_TXF_CNT_MASK 0xff00 /* Tx FIFO data counter mask */ 38*1537d62eSAijun Sun 39*1537d62eSAijun Sun static uint32_t sprd_uart_read(vaddr_t base, uint32_t reg) 40*1537d62eSAijun Sun { 41*1537d62eSAijun Sun return read32(base + reg); 42*1537d62eSAijun Sun } 43*1537d62eSAijun Sun 44*1537d62eSAijun Sun static void sprd_uart_write(vaddr_t base, uint32_t reg, uint32_t value) 45*1537d62eSAijun Sun { 46*1537d62eSAijun Sun write32(value, base + reg); 47*1537d62eSAijun Sun } 48*1537d62eSAijun Sun 49*1537d62eSAijun Sun static void sprd_uart_wait_xmit_done(vaddr_t base) 50*1537d62eSAijun Sun { 51*1537d62eSAijun Sun while (sprd_uart_read(base, UART_STS1) & STS1_TXF_CNT_MASK) 52*1537d62eSAijun Sun ; 53*1537d62eSAijun Sun } 54*1537d62eSAijun Sun 55*1537d62eSAijun Sun static void sprd_uart_wait_rx_data(vaddr_t base) 56*1537d62eSAijun Sun { 57*1537d62eSAijun Sun while (!(sprd_uart_read(base, UART_STS1) & STS1_RXF_CNT_MASK)) 58*1537d62eSAijun Sun ; 59*1537d62eSAijun Sun } 60*1537d62eSAijun Sun 61*1537d62eSAijun Sun void sprd_uart_flush(vaddr_t base) 62*1537d62eSAijun Sun { 63*1537d62eSAijun Sun sprd_uart_wait_xmit_done(base); 64*1537d62eSAijun Sun } 65*1537d62eSAijun Sun 66*1537d62eSAijun Sun void sprd_uart_putc(vaddr_t base, unsigned char ch) 67*1537d62eSAijun Sun { 68*1537d62eSAijun Sun sprd_uart_wait_xmit_done(base); 69*1537d62eSAijun Sun 70*1537d62eSAijun Sun sprd_uart_write(base, UART_TXD, (uint32_t)ch); 71*1537d62eSAijun Sun } 72*1537d62eSAijun Sun 73*1537d62eSAijun Sun unsigned char sprd_uart_getc(vaddr_t base) 74*1537d62eSAijun Sun { 75*1537d62eSAijun Sun sprd_uart_wait_rx_data(base); 76*1537d62eSAijun Sun 77*1537d62eSAijun Sun return sprd_uart_read(base, UART_RXD) & 0xff; 78*1537d62eSAijun Sun } 79