Lines Matching full:port
32 sirfsoc_uart_pio_rx_chars(struct uart_port *port, unsigned int max_rx_count);
58 .port = {
65 .port = {
72 .port = {
80 static inline struct sirfsoc_uart_port *to_sirfport(struct uart_port *port) in to_sirfport() argument
82 return container_of(port, struct sirfsoc_uart_port, port); in to_sirfport()
85 static inline unsigned int sirfsoc_uart_tx_empty(struct uart_port *port) in sirfsoc_uart_tx_empty() argument
88 reg = rd_regl(port, SIRFUART_TX_FIFO_STATUS); in sirfsoc_uart_tx_empty()
89 if (reg & SIRFUART_FIFOEMPTY_MASK(port)) in sirfsoc_uart_tx_empty()
95 static unsigned int sirfsoc_uart_get_mctrl(struct uart_port *port) in sirfsoc_uart_get_mctrl() argument
97 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_get_mctrl()
101 if (!(rd_regl(port, SIRFUART_AFC_CTRL) & in sirfsoc_uart_get_mctrl()
113 static void sirfsoc_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) in sirfsoc_uart_set_mctrl() argument
115 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_set_mctrl()
120 current_val = rd_regl(port, SIRFUART_AFC_CTRL) & ~0xFF; in sirfsoc_uart_set_mctrl()
122 wr_regl(port, SIRFUART_AFC_CTRL, val); in sirfsoc_uart_set_mctrl()
126 static void sirfsoc_uart_stop_tx(struct uart_port *port) in sirfsoc_uart_stop_tx() argument
129 regv = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_stop_tx()
130 wr_regl(port, SIRFUART_INT_EN, regv & ~SIRFUART_TX_INT_EN); in sirfsoc_uart_stop_tx()
133 void sirfsoc_uart_start_tx(struct uart_port *port) in sirfsoc_uart_start_tx() argument
135 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_start_tx()
138 wr_regl(port, SIRFUART_TX_FIFO_OP, SIRFUART_TX_FIFO_START); in sirfsoc_uart_start_tx()
139 regv = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_start_tx()
140 wr_regl(port, SIRFUART_INT_EN, regv | SIRFUART_TX_INT_EN); in sirfsoc_uart_start_tx()
143 static void sirfsoc_uart_stop_rx(struct uart_port *port) in sirfsoc_uart_stop_rx() argument
146 wr_regl(port, SIRFUART_RX_FIFO_OP, 0); in sirfsoc_uart_stop_rx()
147 regv = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_stop_rx()
148 wr_regl(port, SIRFUART_INT_EN, regv & ~SIRFUART_RX_IO_INT_EN); in sirfsoc_uart_stop_rx()
151 static void sirfsoc_uart_disable_ms(struct uart_port *port) in sirfsoc_uart_disable_ms() argument
153 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_disable_ms()
158 reg = rd_regl(port, SIRFUART_AFC_CTRL); in sirfsoc_uart_disable_ms()
159 wr_regl(port, SIRFUART_AFC_CTRL, reg & ~0x3FF); in sirfsoc_uart_disable_ms()
160 reg = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_disable_ms()
161 wr_regl(port, SIRFUART_INT_EN, reg & ~SIRFUART_CTS_INT_EN); in sirfsoc_uart_disable_ms()
164 static void sirfsoc_uart_enable_ms(struct uart_port *port) in sirfsoc_uart_enable_ms() argument
166 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_enable_ms()
172 reg = rd_regl(port, SIRFUART_AFC_CTRL); in sirfsoc_uart_enable_ms()
173 wr_regl(port, SIRFUART_AFC_CTRL, reg | flg); in sirfsoc_uart_enable_ms()
174 reg = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_enable_ms()
175 wr_regl(port, SIRFUART_INT_EN, reg | SIRFUART_CTS_INT_EN); in sirfsoc_uart_enable_ms()
176 uart_handle_cts_change(port, in sirfsoc_uart_enable_ms()
177 !(rd_regl(port, SIRFUART_AFC_CTRL) & SIRFUART_CTS_IN_STATUS)); in sirfsoc_uart_enable_ms()
181 static void sirfsoc_uart_break_ctl(struct uart_port *port, int break_state) in sirfsoc_uart_break_ctl() argument
183 unsigned long ulcon = rd_regl(port, SIRFUART_LINE_CTRL); in sirfsoc_uart_break_ctl()
188 wr_regl(port, SIRFUART_LINE_CTRL, ulcon); in sirfsoc_uart_break_ctl()
192 sirfsoc_uart_pio_rx_chars(struct uart_port *port, unsigned int max_rx_count) in sirfsoc_uart_pio_rx_chars() argument
197 tty = tty_port_tty_get(&port->state->port); in sirfsoc_uart_pio_rx_chars()
201 while (!(rd_regl(port, SIRFUART_RX_FIFO_STATUS) & in sirfsoc_uart_pio_rx_chars()
202 SIRFUART_FIFOEMPTY_MASK(port))) { in sirfsoc_uart_pio_rx_chars()
203 ch = rd_regl(port, SIRFUART_RX_FIFO_DATA) | SIRFUART_DUMMY_READ; in sirfsoc_uart_pio_rx_chars()
204 if (unlikely(uart_handle_sysrq_char(port, ch))) in sirfsoc_uart_pio_rx_chars()
206 uart_insert_char(port, 0, 0, ch, TTY_NORMAL); in sirfsoc_uart_pio_rx_chars()
212 port->icount.rx += rx_count; in sirfsoc_uart_pio_rx_chars()
222 struct uart_port *port = &sirfport->port; in sirfsoc_uart_pio_tx_chars() local
223 struct circ_buf *xmit = &port->state->xmit; in sirfsoc_uart_pio_tx_chars()
226 !(rd_regl(port, SIRFUART_TX_FIFO_STATUS) & in sirfsoc_uart_pio_tx_chars()
227 SIRFUART_FIFOFULL_MASK(port)) && in sirfsoc_uart_pio_tx_chars()
229 wr_regl(port, SIRFUART_TX_FIFO_DATA, xmit->buf[xmit->tail]); in sirfsoc_uart_pio_tx_chars()
231 port->icount.tx++; in sirfsoc_uart_pio_tx_chars()
235 uart_write_wakeup(port); in sirfsoc_uart_pio_tx_chars()
245 struct uart_port *port = &sirfport->port; in sirfsoc_uart_isr() local
246 struct uart_state *state = port->state; in sirfsoc_uart_isr()
247 struct circ_buf *xmit = &port->state->xmit; in sirfsoc_uart_isr()
248 intr_status = rd_regl(port, SIRFUART_INT_STATUS); in sirfsoc_uart_isr()
249 wr_regl(port, SIRFUART_INT_STATUS, intr_status); in sirfsoc_uart_isr()
250 intr_status &= rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_isr()
253 if (uart_handle_break(port)) in sirfsoc_uart_isr()
255 uart_insert_char(port, intr_status, in sirfsoc_uart_isr()
260 port->icount.overrun++; in sirfsoc_uart_isr()
262 port->icount.frame++; in sirfsoc_uart_isr()
267 wr_regl(port, SIRFUART_RX_FIFO_OP, SIRFUART_RX_FIFO_RESET); in sirfsoc_uart_isr()
268 wr_regl(port, SIRFUART_RX_FIFO_OP, 0); in sirfsoc_uart_isr()
269 wr_regl(port, SIRFUART_RX_FIFO_OP, SIRFUART_RX_FIFO_START); in sirfsoc_uart_isr()
270 intr_status &= port->read_status_mask; in sirfsoc_uart_isr()
271 uart_insert_char(port, intr_status, in sirfsoc_uart_isr()
276 cts_status = !(rd_regl(port, SIRFUART_AFC_CTRL) & in sirfsoc_uart_isr()
279 uart_handle_cts_change(port, 1); in sirfsoc_uart_isr()
281 uart_handle_cts_change(port, 0); in sirfsoc_uart_isr()
282 wake_up_interruptible(&state->port.delta_msr_wait); in sirfsoc_uart_isr()
286 sirfsoc_uart_pio_rx_chars(port, SIRFSOC_UART_IO_RX_MAX_CNT); in sirfsoc_uart_isr()
288 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { in sirfsoc_uart_isr()
294 (rd_regl(port, SIRFUART_TX_FIFO_STATUS) & in sirfsoc_uart_isr()
295 SIRFUART_FIFOEMPTY_MASK(port))) in sirfsoc_uart_isr()
296 sirfsoc_uart_stop_tx(port); in sirfsoc_uart_isr()
302 static void sirfsoc_uart_start_rx(struct uart_port *port) in sirfsoc_uart_start_rx() argument
305 regv = rd_regl(port, SIRFUART_INT_EN); in sirfsoc_uart_start_rx()
306 wr_regl(port, SIRFUART_INT_EN, regv | SIRFUART_RX_IO_INT_EN); in sirfsoc_uart_start_rx()
307 wr_regl(port, SIRFUART_RX_FIFO_OP, SIRFUART_RX_FIFO_RESET); in sirfsoc_uart_start_rx()
308 wr_regl(port, SIRFUART_RX_FIFO_OP, 0); in sirfsoc_uart_start_rx()
309 wr_regl(port, SIRFUART_RX_FIFO_OP, SIRFUART_RX_FIFO_START); in sirfsoc_uart_start_rx()
343 static void sirfsoc_uart_set_termios(struct uart_port *port, in sirfsoc_uart_set_termios() argument
347 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_set_termios()
378 baud_rate = uart_get_baud_rate(port, termios, old, 0, 4000000); in sirfsoc_uart_set_termios()
379 spin_lock_irqsave(&port->lock, flags); in sirfsoc_uart_set_termios()
380 port->read_status_mask = SIRFUART_RX_OFLOW_INT; in sirfsoc_uart_set_termios()
381 port->ignore_status_mask = 0; in sirfsoc_uart_set_termios()
384 port->read_status_mask |= in sirfsoc_uart_set_termios()
387 port->read_status_mask |= SIRFUART_RXD_BREAK_INT; in sirfsoc_uart_set_termios()
390 port->ignore_status_mask |= in sirfsoc_uart_set_termios()
393 port->ignore_status_mask |= SIRFUART_DUMMY_READ; in sirfsoc_uart_set_termios()
408 if (UART_ENABLE_MS(port, termios->c_cflag)) { in sirfsoc_uart_set_termios()
410 sirfsoc_uart_enable_ms(port); in sirfsoc_uart_set_termios()
413 sirfsoc_uart_disable_ms(port); in sirfsoc_uart_set_termios()
425 wr_regl(port, SIRFUART_DIVISOR, clk_div_reg); in sirfsoc_uart_set_termios()
434 temp_reg_val = rd_regl(port, SIRFUART_TX_FIFO_OP); in sirfsoc_uart_set_termios()
435 wr_regl(port, SIRFUART_RX_FIFO_OP, 0); in sirfsoc_uart_set_termios()
436 wr_regl(port, SIRFUART_TX_FIFO_OP, in sirfsoc_uart_set_termios()
438 wr_regl(port, SIRFUART_TX_DMA_IO_CTRL, SIRFUART_TX_MODE_IO); in sirfsoc_uart_set_termios()
439 wr_regl(port, SIRFUART_RX_DMA_IO_CTRL, SIRFUART_RX_MODE_IO); in sirfsoc_uart_set_termios()
440 wr_regl(port, SIRFUART_LINE_CTRL, config_reg); in sirfsoc_uart_set_termios()
447 temp = port->line == 1 ? 16 : 64; in sirfsoc_uart_set_termios()
448 wr_regl(port, SIRFUART_TX_FIFO_CTRL, temp / threshold_div); in sirfsoc_uart_set_termios()
449 wr_regl(port, SIRFUART_RX_FIFO_CTRL, temp / threshold_div); in sirfsoc_uart_set_termios()
451 wr_regl(port, SIRFUART_TX_FIFO_OP, temp_reg_val); in sirfsoc_uart_set_termios()
452 uart_update_timeout(port, termios->c_cflag, baud_rate); in sirfsoc_uart_set_termios()
453 sirfsoc_uart_start_rx(port); in sirfsoc_uart_set_termios()
454 wr_regl(port, SIRFUART_TX_RX_EN, SIRFUART_TX_EN | SIRFUART_RX_EN); in sirfsoc_uart_set_termios()
455 spin_unlock_irqrestore(&port->lock, flags); in sirfsoc_uart_set_termios()
458 static void startup_uart_controller(struct uart_port *port) in startup_uart_controller() argument
462 temp_regv = rd_regl(port, SIRFUART_TX_DMA_IO_CTRL); in startup_uart_controller()
463 wr_regl(port, SIRFUART_TX_DMA_IO_CTRL, temp_regv | SIRFUART_TX_MODE_IO); in startup_uart_controller()
464 temp_regv = rd_regl(port, SIRFUART_RX_DMA_IO_CTRL); in startup_uart_controller()
465 wr_regl(port, SIRFUART_RX_DMA_IO_CTRL, temp_regv | SIRFUART_RX_MODE_IO); in startup_uart_controller()
466 wr_regl(port, SIRFUART_TX_DMA_IO_LEN, 0); in startup_uart_controller()
467 wr_regl(port, SIRFUART_RX_DMA_IO_LEN, 0); in startup_uart_controller()
468 wr_regl(port, SIRFUART_TX_RX_EN, SIRFUART_RX_EN | SIRFUART_TX_EN); in startup_uart_controller()
469 wr_regl(port, SIRFUART_TX_FIFO_OP, SIRFUART_TX_FIFO_RESET); in startup_uart_controller()
470 wr_regl(port, SIRFUART_TX_FIFO_OP, 0); in startup_uart_controller()
471 wr_regl(port, SIRFUART_RX_FIFO_OP, SIRFUART_RX_FIFO_RESET); in startup_uart_controller()
472 wr_regl(port, SIRFUART_RX_FIFO_OP, 0); in startup_uart_controller()
473 temp = port->line == 1 ? 16 : 64; in startup_uart_controller()
474 wr_regl(port, SIRFUART_TX_FIFO_CTRL, temp); in startup_uart_controller()
475 wr_regl(port, SIRFUART_RX_FIFO_CTRL, temp); in startup_uart_controller()
478 static int sirfsoc_uart_startup(struct uart_port *port) in sirfsoc_uart_startup() argument
480 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_startup()
481 unsigned int index = port->line; in sirfsoc_uart_startup()
483 set_irq_flags(port->irq, IRQF_VALID | IRQF_NOAUTOEN); in sirfsoc_uart_startup()
484 ret = request_irq(port->irq, in sirfsoc_uart_startup()
490 dev_err(port->dev, "UART%d request IRQ line (%d) failed.\n", in sirfsoc_uart_startup()
491 index, port->irq); in sirfsoc_uart_startup()
494 startup_uart_controller(port); in sirfsoc_uart_startup()
495 enable_irq(port->irq); in sirfsoc_uart_startup()
500 static void sirfsoc_uart_shutdown(struct uart_port *port) in sirfsoc_uart_shutdown() argument
502 struct sirfsoc_uart_port *sirfport = to_sirfport(port); in sirfsoc_uart_shutdown()
503 wr_regl(port, SIRFUART_INT_EN, 0); in sirfsoc_uart_shutdown()
504 free_irq(port->irq, sirfport); in sirfsoc_uart_shutdown()
506 sirfsoc_uart_disable_ms(port); in sirfsoc_uart_shutdown()
511 static const char *sirfsoc_uart_type(struct uart_port *port) in sirfsoc_uart_type() argument
513 return port->type == SIRFSOC_PORT_TYPE ? SIRFUART_PORT_NAME : NULL; in sirfsoc_uart_type()
516 static int sirfsoc_uart_request_port(struct uart_port *port) in sirfsoc_uart_request_port() argument
519 ret = request_mem_region(port->mapbase, in sirfsoc_uart_request_port()
524 static void sirfsoc_uart_release_port(struct uart_port *port) in sirfsoc_uart_release_port() argument
526 release_mem_region(port->mapbase, SIRFUART_MAP_SIZE); in sirfsoc_uart_release_port()
529 static void sirfsoc_uart_config_port(struct uart_port *port, int flags) in sirfsoc_uart_config_port() argument
532 port->type = SIRFSOC_PORT_TYPE; in sirfsoc_uart_config_port()
533 sirfsoc_uart_request_port(port); in sirfsoc_uart_config_port()
562 struct uart_port *port = &sirfsoc_uart_ports[co->index].port; in sirfsoc_uart_console_setup() local
567 if (!port->mapbase) in sirfsoc_uart_console_setup()
572 port->cons = co; in sirfsoc_uart_console_setup()
573 return uart_set_options(port, co, baud, parity, bits, flow); in sirfsoc_uart_console_setup()
576 static void sirfsoc_uart_console_putchar(struct uart_port *port, int ch) in sirfsoc_uart_console_putchar() argument
578 while (rd_regl(port, in sirfsoc_uart_console_putchar()
579 SIRFUART_TX_FIFO_STATUS) & SIRFUART_FIFOFULL_MASK(port)) in sirfsoc_uart_console_putchar()
581 wr_regb(port, SIRFUART_TX_FIFO_DATA, ch); in sirfsoc_uart_console_putchar()
587 struct uart_port *port = &sirfsoc_uart_ports[co->index].port; in sirfsoc_uart_console_write() local
588 uart_console_write(port, s, count, sirfsoc_uart_console_putchar); in sirfsoc_uart_console_write()
626 struct uart_port *port; in sirfsoc_uart_probe() local
638 port = &sirfport->port; in sirfsoc_uart_probe()
639 port->dev = &pdev->dev; in sirfsoc_uart_probe()
640 port->private_data = sirfport; in sirfsoc_uart_probe()
647 &port->fifosize)) { in sirfsoc_uart_probe()
660 port->mapbase = res->start; in sirfsoc_uart_probe()
661 port->membase = devm_ioremap(&pdev->dev, res->start, resource_size(res)); in sirfsoc_uart_probe()
662 if (!port->membase) { in sirfsoc_uart_probe()
673 port->irq = res->start; in sirfsoc_uart_probe()
684 port->ops = &sirfsoc_uart_ops; in sirfsoc_uart_probe()
685 spin_lock_init(&port->lock); in sirfsoc_uart_probe()
688 ret = uart_add_one_port(&sirfsoc_uart_drv, port); in sirfsoc_uart_probe()
690 dev_err(&pdev->dev, "Cannot add UART port(%d).\n", pdev->id); in sirfsoc_uart_probe()
704 devm_iounmap(&pdev->dev, port->membase); in sirfsoc_uart_probe()
712 struct uart_port *port = &sirfport->port; in sirfsoc_uart_remove() local
718 devm_iounmap(&pdev->dev, port->membase); in sirfsoc_uart_remove()
719 uart_remove_one_port(&sirfsoc_uart_drv, port); in sirfsoc_uart_remove()
727 struct uart_port *port = &sirfport->port; in sirfsoc_uart_suspend() local
728 uart_suspend_port(&sirfsoc_uart_drv, port); in sirfsoc_uart_suspend()
735 struct uart_port *port = &sirfport->port; in sirfsoc_uart_resume() local
736 uart_resume_port(&sirfsoc_uart_drv, port); in sirfsoc_uart_resume()