summaryrefslogtreecommitdiff
path: root/chip/mt_scp/mt8183/uart.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/mt_scp/mt8183/uart.c')
-rw-r--r--chip/mt_scp/mt8183/uart.c179
1 files changed, 0 insertions, 179 deletions
diff --git a/chip/mt_scp/mt8183/uart.c b/chip/mt_scp/mt8183/uart.c
deleted file mode 100644
index 7907f9537d..0000000000
--- a/chip/mt_scp/mt8183/uart.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* SCP UART module */
-
-#include "clock_chip.h"
-#include "console.h"
-#include "registers.h"
-#include "serial_reg.h"
-#include "system.h"
-#include "task.h"
-#include "uart.h"
-#include "util.h"
-
-/* Console UART index */
-#define UARTN CONFIG_UART_CONSOLE
-#define UART_IDLE_WAIT_US 500
-
-static uint8_t uart_done, tx_started;
-
-int uart_init_done(void)
-{
- /*
- * TODO: AP UART support
- * When access AP UART port, wait for AP peripheral clock
- */
- return uart_done;
-}
-
-void uart_tx_start(void)
-{
- tx_started = 1;
-
- /* AP UART mode doesn't support interrupt */
- if (UARTN >= SCP_UART_COUNT)
- return;
-
- if (UART_IER(UARTN) & UART_IER_THRI)
- return;
- disable_sleep(SLEEP_MASK_UART);
- UART_IER(UARTN) |= UART_IER_THRI;
-}
-
-void uart_tx_stop(void)
-{
- tx_started = 0;
-
- /* AP UART mode doesn't support interrupt */
- if (UARTN >= SCP_UART_COUNT)
- return;
-
- UART_IER(UARTN) &= ~UART_IER_THRI;
- enable_sleep(SLEEP_MASK_UART);
-}
-
-void uart_tx_flush(void)
-{
- while (!(UART_LSR(UARTN) & UART_LSR_TEMT))
- ;
-}
-
-int uart_tx_ready(void)
-{
- /* Check xmit FIFO empty */
- return UART_LSR(UARTN) & UART_LSR_THRE;
-}
-
-int uart_rx_available(void)
-{
- /* Check rcvr data ready */
- return UART_LSR(UARTN) & UART_LSR_DR;
-}
-
-void uart_write_char(char c)
-{
- while (!uart_tx_ready())
- ;
-
- UART_DATA(UARTN) = c;
-}
-
-int uart_read_char(void)
-{
- return UART_DATA(UARTN);
-}
-
-void uart_process(void)
-{
- uart_process_input();
- uart_process_output();
-}
-
-#if (UARTN < SCP_UART_COUNT)
-DECLARE_IRQ(UART_IRQ(UARTN), uart_interrupt, 2);
-void uart_interrupt(void)
-{
- uint8_t ier;
-
- task_clear_pending_irq(UART_IRQ(UARTN));
- uart_process();
- ier = UART_IER(UARTN);
- UART_IER(UARTN) = 0;
- UART_IER(UARTN) = ier;
-}
-
-DECLARE_IRQ(UART_RX_IRQ(UARTN), uart_rx_interrupt, 2);
-void uart_rx_interrupt(void)
-{
- uint8_t ier;
-
- task_clear_pending_irq(UART_RX_IRQ(UARTN));
- SCP_INTC_UART_RX_IRQ &= ~BIT(UARTN);
- uart_process();
- ier = UART_IER(UARTN);
- UART_IER(UARTN) = 0;
- UART_IER(UARTN) = ier;
- SCP_INTC_UART_RX_IRQ |= 1 << UARTN;
-}
-#endif
-
-void uart_task(void)
-{
-#if (UARTN >= SCP_UART_COUNT)
- while (1) {
- if (uart_rx_available() || tx_started)
- uart_process();
- else
- task_wait_event(UART_IDLE_WAIT_US);
- }
-#endif
-}
-
-void uart_init(void)
-{
- const uint32_t baud_rate = CONFIG_UART_BAUD_RATE;
- /*
- * UART clock source is set to ULPOSC1 / 10 below.
- *
- * TODO(b:134035444): We could get slightly more precise frequency by
- * using the _measured_ ULPOSC1 frequency (instead of the target).
- */
- const uint32_t uart_clock = ULPOSC1_CLOCK_MHZ * 1000 / 10 * 1000;
- const uint32_t div = DIV_ROUND_NEAREST(uart_clock, baud_rate * 16);
-
- /* Init clock */
-#if UARTN == 0
- SCP_CLK_UART = CLK_UART_SEL_ULPOSC1_DIV10;
- SCP_CLK_GATE |= CG_UART_M | CG_UART_B | CG_UART_RSTN;
-#elif UARTN == 1
- SCP_CLK_UART = CLK_UART1_SEL_ULPOSC1_DIV10;
- SCP_CLK_GATE |= CG_UART1_M | CG_UART1_B | CG_UART1_RSTN;
-#endif
-
- /* Init and clear FIFO */
- UART_FCR(UARTN) = UART_FCR_ENABLE_FIFO
- | UART_FCR_CLEAR_RCVR
- | UART_FCR_CLEAR_XMIT;
- /* Line control: parity none, 8 bit, 1 stop bit */
- UART_LCR(UARTN) = UART_LCR_WLEN8;
- /* For baud rate <= 115200 */
- UART_HIGHSPEED(UARTN) = 0;
- /* DLAB = 1 and update DLL DLH */
- UART_LCR(UARTN) |= UART_LCR_DLAB;
- UART_DLL(UARTN) = div & 0xff;
- UART_DLH(UARTN) = (div >> 8) & 0xff;
- UART_LCR(UARTN) &= ~UART_LCR_DLAB;
- UART_IER(UARTN) |= UART_IER_RDI;
-
-#if (UARTN < SCP_UART_COUNT)
- task_enable_irq(UART_IRQ(UARTN));
- task_enable_irq(UART_RX_IRQ(UARTN));
- /* UART RX IRQ needs an extra enable */
- SCP_INTC_UART_RX_IRQ |= 1 << UARTN;
-#endif
- gpio_config_module(MODULE_UART, 1);
- uart_done = 1;
-}