aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/tty/serial/sirfsoc_uart.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/drivers/tty/serial/sirfsoc_uart.c b/drivers/tty/serial/sirfsoc_uart.c
index 10718c0d5439..d37609dfcf76 100644
--- a/drivers/tty/serial/sirfsoc_uart.c
+++ b/drivers/tty/serial/sirfsoc_uart.c
@@ -649,37 +649,10 @@ static void sirfsoc_uart_set_termios(struct uart_port *port,
649 spin_unlock_irqrestore(&port->lock, flags); 649 spin_unlock_irqrestore(&port->lock, flags);
650} 650}
651 651
652static void startup_uart_controller(struct uart_port *port)
653{
654 struct sirfsoc_uart_port *sirfport = to_sirfport(port);
655 struct sirfsoc_register *ureg = &sirfport->uart_reg->uart_reg;
656 unsigned long temp_regv;
657 int temp;
658 temp_regv = rd_regl(port, ureg->sirfsoc_tx_dma_io_ctrl);
659 wr_regl(port, ureg->sirfsoc_tx_dma_io_ctrl, temp_regv |
660 SIRFUART_IO_MODE);
661 temp_regv = rd_regl(port, ureg->sirfsoc_rx_dma_io_ctrl);
662 wr_regl(port, ureg->sirfsoc_rx_dma_io_ctrl, temp_regv |
663 SIRFUART_IO_MODE);
664 wr_regl(port, ureg->sirfsoc_tx_dma_io_len, 0);
665 wr_regl(port, ureg->sirfsoc_rx_dma_io_len, 0);
666 wr_regl(port, ureg->sirfsoc_tx_rx_en, SIRFUART_RX_EN | SIRFUART_TX_EN);
667 if (sirfport->uart_reg->uart_type == SIRF_USP_UART)
668 wr_regl(port, ureg->sirfsoc_mode1,
669 SIRFSOC_USP_ENDIAN_CTRL_LSBF |
670 SIRFSOC_USP_EN);
671 wr_regl(port, ureg->sirfsoc_tx_fifo_op, SIRFUART_FIFO_RESET);
672 wr_regl(port, ureg->sirfsoc_tx_fifo_op, 0);
673 wr_regl(port, ureg->sirfsoc_rx_fifo_op, SIRFUART_FIFO_RESET);
674 wr_regl(port, ureg->sirfsoc_rx_fifo_op, 0);
675 temp = SIRFUART_FIFO_THD(port);
676 wr_regl(port, ureg->sirfsoc_tx_fifo_ctrl, temp);
677 wr_regl(port, ureg->sirfsoc_rx_fifo_ctrl, temp);
678}
679
680static int sirfsoc_uart_startup(struct uart_port *port) 652static int sirfsoc_uart_startup(struct uart_port *port)
681{ 653{
682 struct sirfsoc_uart_port *sirfport = to_sirfport(port); 654 struct sirfsoc_uart_port *sirfport = to_sirfport(port);
655 struct sirfsoc_register *ureg = &sirfport->uart_reg->uart_reg;
683 unsigned int index = port->line; 656 unsigned int index = port->line;
684 int ret; 657 int ret;
685 set_irq_flags(port->irq, IRQF_VALID | IRQF_NOAUTOEN); 658 set_irq_flags(port->irq, IRQF_VALID | IRQF_NOAUTOEN);
@@ -693,7 +666,27 @@ static int sirfsoc_uart_startup(struct uart_port *port)
693 index, port->irq); 666 index, port->irq);
694 goto irq_err; 667 goto irq_err;
695 } 668 }
696 startup_uart_controller(port); 669
670 /* initial hardware settings */
671 wr_regl(port, ureg->sirfsoc_tx_dma_io_ctrl,
672 rd_regl(port, ureg->sirfsoc_tx_dma_io_ctrl) |
673 SIRFUART_IO_MODE);
674 wr_regl(port, ureg->sirfsoc_rx_dma_io_ctrl,
675 rd_regl(port, ureg->sirfsoc_rx_dma_io_ctrl) |
676 SIRFUART_IO_MODE);
677 wr_regl(port, ureg->sirfsoc_tx_dma_io_len, 0);
678 wr_regl(port, ureg->sirfsoc_rx_dma_io_len, 0);
679 wr_regl(port, ureg->sirfsoc_tx_rx_en, SIRFUART_RX_EN | SIRFUART_TX_EN);
680 if (sirfport->uart_reg->uart_type == SIRF_USP_UART)
681 wr_regl(port, ureg->sirfsoc_mode1,
682 SIRFSOC_USP_ENDIAN_CTRL_LSBF |
683 SIRFSOC_USP_EN);
684 wr_regl(port, ureg->sirfsoc_tx_fifo_op, SIRFUART_FIFO_RESET);
685 wr_regl(port, ureg->sirfsoc_tx_fifo_op, 0);
686 wr_regl(port, ureg->sirfsoc_rx_fifo_op, SIRFUART_FIFO_RESET);
687 wr_regl(port, ureg->sirfsoc_rx_fifo_op, 0);
688 wr_regl(port, ureg->sirfsoc_tx_fifo_ctrl, SIRFUART_FIFO_THD(port));
689 wr_regl(port, ureg->sirfsoc_rx_fifo_ctrl, SIRFUART_FIFO_THD(port));
697 690
698 sirfport->ms_enabled = false; 691 sirfport->ms_enabled = false;
699 if (sirfport->uart_reg->uart_type == SIRF_USP_UART && 692 if (sirfport->uart_reg->uart_type == SIRF_USP_UART &&
@@ -711,6 +704,7 @@ static int sirfsoc_uart_startup(struct uart_port *port)
711 704
712 enable_irq(port->irq); 705 enable_irq(port->irq);
713 706
707 return 0;
714init_rx_err: 708init_rx_err:
715 free_irq(port->irq, sirfport); 709 free_irq(port->irq, sirfport);
716irq_err: 710irq_err: