1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2017, Linaro Limited 4 */ 5 #include <drivers/stih_asc.h> 6 #include <io.h> 7 #include <keep.h> 8 #include <util.h> 9 10 #define ASC_BAUDRATE 0x00 11 #define ASC_TXBUFFER 0x04 12 #define ASC_STATUS 0x14 13 14 #define ASC_STATUS_TX_EMPTY BIT(1) 15 #define ASC_STATUS_TX_HALF_EMPTY BIT(2) 16 17 static vaddr_t chip_to_base(struct serial_chip *chip) 18 { 19 struct stih_asc_pd *pd = 20 container_of(chip, struct stih_asc_pd, chip); 21 22 return io_pa_or_va(&pd->base); 23 } 24 25 static void stih_asc_flush(struct serial_chip *chip) 26 { 27 vaddr_t base = chip_to_base(chip); 28 29 while (!(io_read32(base + ASC_STATUS) & ASC_STATUS_TX_EMPTY)) 30 ; 31 } 32 33 static void stih_asc_putc(struct serial_chip *chip, int ch) 34 { 35 vaddr_t base = chip_to_base(chip); 36 37 while (!(io_read32(base + ASC_STATUS) & ASC_STATUS_TX_HALF_EMPTY)) 38 ; 39 40 io_write32(base + ASC_TXBUFFER, ch); 41 } 42 43 static const struct serial_ops stih_asc_ops = { 44 .flush = stih_asc_flush, 45 .putc = stih_asc_putc, 46 }; 47 KEEP_PAGER(stih_asc_ops); 48 49 void stih_asc_init(struct stih_asc_pd *pd, vaddr_t base) 50 { 51 pd->base.pa = base; 52 pd->chip.ops = &stih_asc_ops; 53 } 54