summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorDamien Le Moal <damien.lemoal@wdc.com>2019-09-04 07:27:27 +0300
committerAnup Patel <anup@brainfault.org>2019-09-05 16:17:56 +0300
commitfca8c3be0122d4b90cef572aefddd65c27fcaba6 (patch)
treee71068ed5e5d0d0e3f2f29a7760e20181556bd2e /platform
parent6ed2bc154f99d3c067775d8a83bcd42a44838dcf (diff)
downloadopensbi-fca8c3be0122d4b90cef572aefddd65c27fcaba6.tar.xz
kendryte/k210: Use sifive UART driver
The Kendryte K210 UARTHS is compatible with SiFive UART. So use the sifive uart driver and remove the k210 uarths platform code. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'platform')
-rw-r--r--platform/kendryte/k210/objects.mk2
-rw-r--r--platform/kendryte/k210/platform.c25
-rw-r--r--platform/kendryte/k210/uarths.c64
-rw-r--r--platform/kendryte/k210/uarths.h171
4 files changed, 9 insertions, 253 deletions
diff --git a/platform/kendryte/k210/objects.mk b/platform/kendryte/k210/objects.mk
index 1924d7a..58ba7c6 100644
--- a/platform/kendryte/k210/objects.mk
+++ b/platform/kendryte/k210/objects.mk
@@ -7,5 +7,5 @@
# Damien Le Moal <damien.lemoal@wdc.com>
#
-platform-objs-y += uarths.o sysctl.o platform.o
+platform-objs-y += sysctl.o platform.o
platform-dtb-y += k210.dtb
diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
index 19c569c..a986651 100644
--- a/platform/kendryte/k210/platform.c
+++ b/platform/kendryte/k210/platform.c
@@ -14,26 +14,17 @@
#include <sbi/sbi_console.h>
#include <sbi_utils/irqchip/plic.h>
#include <sbi_utils/sys/clint.h>
+#include <sbi_utils/serial/sifive-uart.h>
#include "platform.h"
-#include "uarths.h"
+#include "sysctl.h"
-#define K210_UART_BAUDRATE 115200
+#define K210_UART_BASE_ADDR 0x38000000U
+#define K210_UART_BAUDRATE 115200
static int k210_console_init(void)
{
- uarths_init(K210_UART_BAUDRATE, UARTHS_STOP_1);
-
- return 0;
-}
-
-static void k210_console_putc(char c)
-{
- uarths_putc(c);
-}
-
-static int k210_console_getc(void)
-{
- return uarths_getc();
+ return sifive_uart_init(K210_UART_BASE_ADDR,
+ sysctl_get_cpu_freq(), K210_UART_BAUDRATE);
}
static int k210_irqchip_init(bool cold_boot)
@@ -95,8 +86,8 @@ static int k210_system_shutdown(u32 type)
const struct sbi_platform_operations platform_ops = {
.console_init = k210_console_init,
- .console_putc = k210_console_putc,
- .console_getc = k210_console_getc,
+ .console_putc = sifive_uart_putc,
+ .console_getc = sifive_uart_getc,
.irqchip_init = k210_irqchip_init,
diff --git a/platform/kendryte/k210/uarths.c b/platform/kendryte/k210/uarths.c
deleted file mode 100644
index 67d5d1c..0000000
--- a/platform/kendryte/k210/uarths.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- *
- * Copyright 2018 Canaan Inc.
- * Copyright (c) 2019 Western Digital Corporation or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "sysctl.h"
-#include "uarths.h"
-
-static volatile struct uarths *const uarths =
- (volatile struct uarths *)UARTHS_BASE_ADDR;
-
-void uarths_init(u32 baud_rate, enum uarths_stopbit stopbit)
-{
- u32 freq = sysctl_get_cpu_freq();
- u16 div = freq / baud_rate - 1;
-
- /* Set UART registers */
- uarths->div.div = div;
- uarths->txctrl.nstop = stopbit;
- uarths->txctrl.txen = 1;
- uarths->rxctrl.rxen = 1;
- uarths->txctrl.txcnt = 0;
- uarths->rxctrl.rxcnt = 0;
- uarths->ip.txwm = 1;
- uarths->ip.rxwm = 0;
- uarths->ie.txwm = 1;
- uarths->ie.rxwm = 0;
-
- /* Clear input */
- if (!uarths->rxdata.empty)
- (void)uarths_getc();
-}
-
-void uarths_putc(char c)
-{
- while (uarths->txdata.full)
- ;
-
- uarths->txdata.data = (u8)c;
-}
-
-int uarths_getc(void)
-{
- struct uarths_rxdata rx = uarths->rxdata;
-
- if (rx.empty)
- return -1;
-
- return rx.data;
-}
diff --git a/platform/kendryte/k210/uarths.h b/platform/kendryte/k210/uarths.h
deleted file mode 100644
index 18b7e95..0000000
--- a/platform/kendryte/k210/uarths.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- *
- * Copyright 2018 Canaan Inc.
- * Copyright (c) 2019 Western Digital Corporation or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Universal Asynchronous Receiver/Transmitter (UART)
- * The UART peripheral supports the following features:
- *
- * - 8-N-1 and 8-N-2 formats: 8 data bits, no parity bit, 1 start
- * bit, 1 or 2 stop bits
- *
- * - 8-entry transmit and receive FIFO buffers with programmable
- * watermark interrupts
- *
- * - 16× Rx oversampling with 2/3 majority voting per bit
- *
- * The UART peripheral does not support hardware flow control or
- * other modem control signals, or synchronous serial data
- * tranfesrs.
- *
- * UART RAM Layout
- * | Address | Name | Description |
- * |-----------|----------|---------------------------------|
- * | 0x000 | txdata | Transmit data register |
- * | 0x004 | rxdata | Receive data register |
- * | 0x008 | txctrl | Transmit control register |
- * | 0x00C | rxctrl | Receive control register |
- * | 0x010 | ie | UART interrupt enable |
- * | 0x014 | ip | UART Interrupt pending |
- * | 0x018 | div | Baud rate divisor |
- */
-
-#ifndef _K210_UARTHS_H_
-#define _K210_UARTHS_H_
-
-#include <sbi/sbi_types.h>
-
-/* clang-format off */
-
-/* Base register address */
-#define UARTHS_BASE_ADDR (0x38000000U)
-
-/* Register address offsets */
-#define UARTHS_REG_TXFIFO 0x00
-#define UARTHS_REG_RXFIFO 0x04
-#define UARTHS_REG_TXCTRL 0x08
-#define UARTHS_REG_RXCTRL 0x0c
-#define UARTHS_REG_IE 0x10
-#define UARTHS_REG_IP 0x14
-#define UARTHS_REG_DIV 0x18
-
-/* TXCTRL register */
-#define UARTHS_TXEN 0x01
-#define UARTHS_TXWM(x) (((x) & 0xffff) << 16)
-
-/* RXCTRL register */
-#define UARTHS_RXEN 0x01
-#define UARTHS_RXWM(x) (((x) & 0xffff) << 16)
-
-/* IP register */
-#define UARTHS_IP_TXWM 0x01
-#define UARTHS_IP_RXWM 0x02
-
-/* clang-format on */
-
-struct uarths_txdata {
- /* Bits [7:0] is data */
- u32 data : 8;
- /* Bits [30:8] is 0 */
- u32 zero : 23;
- /* Bit 31 is full status */
- u32 full : 1;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_rxdata {
- /* Bits [7:0] is data */
- u32 data : 8;
- /* Bits [30:8] is 0 */
- u32 zero : 23;
- /* Bit 31 is empty status */
- u32 empty : 1;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_txctrl {
- /* Bit 0 is txen, controls whether the Tx channel is active. */
- u32 txen : 1;
- /* Bit 1 is nstop, 0 for one stop bit and 1 for two stop bits */
- u32 nstop : 1;
- /* Bits [15:2] is reserved */
- u32 resv0 : 14;
- /* Bits [18:16] is threshold of interrupt triggers */
- u32 txcnt : 3;
- /* Bits [31:19] is reserved */
- u32 resv1 : 13;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_rxctrl {
- /* Bit 0 is txen, controls whether the Tx channel is active. */
- u32 rxen : 1;
- /* Bits [15:1] is reserved */
- u32 resv0 : 15;
- /* Bits [18:16] is threshold of interrupt triggers */
- u32 rxcnt : 3;
- /* Bits [31:19] is reserved */
- u32 resv1 : 13;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_ip {
- /* Bit 0 is txwm, raised less than txcnt */
- u32 txwm : 1;
- /* Bit 1 is txwm, raised greater than rxcnt */
- u32 rxwm : 1;
- /* Bits [31:2] is 0 */
- u32 zero : 30;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_ie {
- /* Bit 0 is txwm, raised less than txcnt */
- u32 txwm : 1;
- /* Bit 1 is txwm, raised greater than rxcnt */
- u32 rxwm : 1;
- /* Bits [31:2] is 0 */
- u32 zero : 30;
-} __attribute__((packed, aligned(4)));
-
-struct uarths_div {
- /* Bits [31:2] is baud rate divisor register */
- u32 div : 16;
- /* Bits [31:16] is 0 */
- u32 zero : 16;
-} __attribute__((packed, aligned(4)));
-
-struct uarths {
- /* Address offset 0x00 */
- struct uarths_txdata txdata;
- /* Address offset 0x04 */
- struct uarths_rxdata rxdata;
- /* Address offset 0x08 */
- struct uarths_txctrl txctrl;
- /* Address offset 0x0c */
- struct uarths_rxctrl rxctrl;
- /* Address offset 0x10 */
- struct uarths_ie ie;
- /* Address offset 0x14 */
- struct uarths_ip ip;
- /* Address offset 0x18 */
- struct uarths_div div;
-} __attribute__((packed, aligned(4)));
-
-enum uarths_stopbit { UARTHS_STOP_1, UARTHS_STOP_2 };
-
-void uarths_init(u32 baud_rate, enum uarths_stopbit stopbit);
-void uarths_putc(char c);
-int uarths_getc(void);
-
-#endif /* _K210_UARTHS_H_ */