| /* |
| * SPDX-License-Identifier: BSD-2-Clause |
| * |
| * Copyright (c) 2020 Vijai Kumar K <vijai@behindbytes.com> |
| */ |
| |
| #include <sbi/riscv_io.h> |
| #include <sbi/sbi_console.h> |
| #include <sbi_utils/serial/shakti-uart.h> |
| |
| #define REG_BAUD 0x00 |
| #define REG_TX 0x04 |
| #define REG_RX 0x08 |
| #define REG_STATUS 0x0C |
| #define REG_DELAY 0x10 |
| #define REG_CONTROL 0x14 |
| #define REG_INT_EN 0x18 |
| #define REG_IQ_CYCLES 0x1C |
| #define REG_RX_THRES 0x20 |
| |
| #define UART_TX_FULL 0x2 |
| #define UART_RX_NOT_EMPTY 0x4 |
| #define UART_RX_FULL 0x8 |
| |
| static volatile char *uart_base; |
| |
| static void shakti_uart_putc(char ch) |
| { |
| while ((readb(uart_base + REG_STATUS) & UART_TX_FULL)) |
| ; |
| writeb(ch, uart_base + REG_TX); |
| } |
| |
| static int shakti_uart_getc(void) |
| { |
| if (readb(uart_base + REG_STATUS) & UART_RX_NOT_EMPTY) |
| return readb(uart_base + REG_RX); |
| return -1; |
| } |
| |
| static struct sbi_console_device shakti_console = { |
| .name = "shakti_uart", |
| .console_putc = shakti_uart_putc, |
| .console_getc = shakti_uart_getc |
| }; |
| |
| int shakti_uart_init(unsigned long base, u32 in_freq, u32 baudrate) |
| { |
| uart_base = (volatile char *)base; |
| u16 baud; |
| |
| if (baudrate) { |
| baud = (u16)(in_freq / (16 * baudrate)); |
| writew(baud, uart_base + REG_BAUD); |
| } |
| |
| sbi_console_set_device(&shakti_console); |
| |
| return 0; |
| } |