| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (c) 2017, Linaro Limited |
| */ |
| #include <drivers/stih_asc.h> |
| #include <io.h> |
| #include <keep.h> |
| #include <util.h> |
| |
| #define ASC_BAUDRATE 0x00 |
| #define ASC_TXBUFFER 0x04 |
| #define ASC_STATUS 0x14 |
| |
| #define ASC_STATUS_TX_EMPTY BIT(1) |
| #define ASC_STATUS_TX_HALF_EMPTY BIT(2) |
| |
| static vaddr_t chip_to_base(struct serial_chip *chip) |
| { |
| struct stih_asc_pd *pd = |
| container_of(chip, struct stih_asc_pd, chip); |
| |
| return io_pa_or_va(&pd->base); |
| } |
| |
| static void stih_asc_flush(struct serial_chip *chip) |
| { |
| vaddr_t base = chip_to_base(chip); |
| |
| while (!(io_read32(base + ASC_STATUS) & ASC_STATUS_TX_EMPTY)) |
| ; |
| } |
| |
| static void stih_asc_putc(struct serial_chip *chip, int ch) |
| { |
| vaddr_t base = chip_to_base(chip); |
| |
| while (!(io_read32(base + ASC_STATUS) & ASC_STATUS_TX_HALF_EMPTY)) |
| ; |
| |
| io_write32(base + ASC_TXBUFFER, ch); |
| } |
| |
| static const struct serial_ops stih_asc_ops = { |
| .flush = stih_asc_flush, |
| .putc = stih_asc_putc, |
| }; |
| KEEP_PAGER(stih_asc_ops); |
| |
| void stih_asc_init(struct stih_asc_pd *pd, vaddr_t base) |
| { |
| pd->base.pa = base; |
| pd->chip.ops = &stih_asc_ops; |
| } |