1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#include <config.h>
8#include <stdint.h>
9#include <util.h>
10#include <machine/io.h>
11
12#define ULCON       0x0000 /* line control */
13#define UCON        0x0004 /* control */
14#define UFCON       0x0008 /* fifo control */
15#define UMCON       0x000C /* modem control */
16#define UTRSTAT     0x0010 /* TX/RX status */
17#define UERSTAT     0x0014 /* RX error status */
18#define UFSTAT      0x0018 /* FIFO status */
19#define UMSTAT      0x001C /* modem status */
20#define UTXH        0x0020 /* TX buffer */
21#define URXH        0x0024 /* RX buffer */
22#define UBRDIV      0x0028 /* baud rate divisor */
23#define UFRACVAL    0x002C /* divisor fractional value */
24#define UINTP       0x0030 /* interrupt pending */
25#define UINTSP      0x0034 /* interrupt source pending */
26#define UINTM       0x0038 /* interrupt mask */
27
28/* UTRSTAT */
29#define TX_EMPTY        BIT(2)
30#define TXBUF_EMPTY     BIT(1)
31#define RXBUF_READY     BIT(0)
32
33#define UART_REG(X) ((volatile uint32_t *)(UART_PPTR + (X)))
34
35#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
36void putDebugChar(unsigned char c)
37{
38    while ((*UART_REG(UTRSTAT) & TXBUF_EMPTY) == 0);
39    *UART_REG(UTXH) = (c & 0xff);
40}
41#endif
42
43#ifdef CONFIG_DEBUG_BUILD
44unsigned char getDebugChar(void)
45{
46    if ((*UART_REG(UTRSTAT) & RXBUF_READY)) {
47        return (unsigned char) * UART_REG(URXH);
48    } else {
49        return -1;
50    }
51}
52#endif /* CONFIG_DEBUG_BUILD */
53