diff options
-rw-r--r-- | drivers/tty/serial/sirfsoc_uart.c | 52 |
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 | ||
652 | static 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 | |||
680 | static int sirfsoc_uart_startup(struct uart_port *port) | 652 | static 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; | ||
714 | init_rx_err: | 708 | init_rx_err: |
715 | free_irq(port->irq, sirfport); | 709 | free_irq(port->irq, sirfport); |
716 | irq_err: | 710 | irq_err: |