Lines Matching refs:port

75 	struct uart_port port;  member
80 static void sp_uart_put_char(struct uart_port *port, unsigned int ch) in sp_uart_put_char() argument
82 writel(ch, port->membase + SUP_UART_DATA); in sp_uart_put_char()
85 static u32 sunplus_tx_buf_not_full(struct uart_port *port) in sunplus_tx_buf_not_full() argument
87 unsigned int lsr = readl(port->membase + SUP_UART_LSR); in sunplus_tx_buf_not_full()
92 static unsigned int sunplus_tx_empty(struct uart_port *port) in sunplus_tx_empty() argument
94 unsigned int lsr = readl(port->membase + SUP_UART_LSR); in sunplus_tx_empty()
99 static void sunplus_set_mctrl(struct uart_port *port, unsigned int mctrl) in sunplus_set_mctrl() argument
101 unsigned int mcr = readl(port->membase + SUP_UART_MCR); in sunplus_set_mctrl()
128 writel(mcr, port->membase + SUP_UART_MCR); in sunplus_set_mctrl()
131 static unsigned int sunplus_get_mctrl(struct uart_port *port) in sunplus_get_mctrl() argument
135 mcr = readl(port->membase + SUP_UART_MCR); in sunplus_get_mctrl()
155 static void sunplus_stop_tx(struct uart_port *port) in sunplus_stop_tx() argument
159 isc = readl(port->membase + SUP_UART_ISC); in sunplus_stop_tx()
161 writel(isc, port->membase + SUP_UART_ISC); in sunplus_stop_tx()
164 static void sunplus_start_tx(struct uart_port *port) in sunplus_start_tx() argument
168 isc = readl(port->membase + SUP_UART_ISC); in sunplus_start_tx()
170 writel(isc, port->membase + SUP_UART_ISC); in sunplus_start_tx()
173 static void sunplus_stop_rx(struct uart_port *port) in sunplus_stop_rx() argument
177 isc = readl(port->membase + SUP_UART_ISC); in sunplus_stop_rx()
179 writel(isc, port->membase + SUP_UART_ISC); in sunplus_stop_rx()
182 static void sunplus_break_ctl(struct uart_port *port, int ctl) in sunplus_break_ctl() argument
187 uart_port_lock_irqsave(port, &flags); in sunplus_break_ctl()
189 lcr = readl(port->membase + SUP_UART_LCR); in sunplus_break_ctl()
196 writel(lcr, port->membase + SUP_UART_LCR); in sunplus_break_ctl()
198 uart_port_unlock_irqrestore(port, flags); in sunplus_break_ctl()
201 static void transmit_chars(struct uart_port *port) in transmit_chars() argument
203 struct tty_port *tport = &port->state->port; in transmit_chars()
205 if (port->x_char) { in transmit_chars()
206 sp_uart_put_char(port, port->x_char); in transmit_chars()
207 port->icount.tx++; in transmit_chars()
208 port->x_char = 0; in transmit_chars()
212 if (kfifo_is_empty(&tport->xmit_fifo) || uart_tx_stopped(port)) { in transmit_chars()
213 sunplus_stop_tx(port); in transmit_chars()
220 if (!uart_fifo_get(port, &ch)) in transmit_chars()
223 sp_uart_put_char(port, ch); in transmit_chars()
224 } while (sunplus_tx_buf_not_full(port)); in transmit_chars()
227 uart_write_wakeup(port); in transmit_chars()
230 sunplus_stop_tx(port); in transmit_chars()
233 static void receive_chars(struct uart_port *port) in receive_chars() argument
235 unsigned int lsr = readl(port->membase + SUP_UART_LSR); in receive_chars()
239 ch = readl(port->membase + SUP_UART_DATA); in receive_chars()
241 port->icount.rx++; in receive_chars()
246 port->icount.brk++; in receive_chars()
248 if (uart_handle_break(port)) in receive_chars()
251 port->icount.parity++; in receive_chars()
254 port->icount.frame++; in receive_chars()
259 port->icount.overrun++; in receive_chars()
262 if (port->ignore_status_mask & SUP_DUMMY_READ) in receive_chars()
265 if (uart_prepare_sysrq_char(port, ch)) in receive_chars()
268 uart_insert_char(port, lsr, SUP_UART_LSR_OE, ch, flag); in receive_chars()
271 lsr = readl(port->membase + SUP_UART_LSR); in receive_chars()
274 tty_flip_buffer_push(&port->state->port); in receive_chars()
279 struct uart_port *port = args; in sunplus_uart_irq() local
282 uart_port_lock(port); in sunplus_uart_irq()
284 isc = readl(port->membase + SUP_UART_ISC); in sunplus_uart_irq()
287 receive_chars(port); in sunplus_uart_irq()
290 transmit_chars(port); in sunplus_uart_irq()
292 uart_unlock_and_check_sysrq(port); in sunplus_uart_irq()
297 static int sunplus_startup(struct uart_port *port) in sunplus_startup() argument
303 ret = request_irq(port->irq, sunplus_uart_irq, 0, "sunplus_uart", port); in sunplus_startup()
307 uart_port_lock_irqsave(port, &flags); in sunplus_startup()
313 writel(isc, port->membase + SUP_UART_ISC); in sunplus_startup()
314 uart_port_unlock_irqrestore(port, flags); in sunplus_startup()
319 static void sunplus_shutdown(struct uart_port *port) in sunplus_shutdown() argument
323 uart_port_lock_irqsave(port, &flags); in sunplus_shutdown()
328 writel(0, port->membase + SUP_UART_ISC); /* disable all interrupt */ in sunplus_shutdown()
329 uart_port_unlock_irqrestore(port, flags); in sunplus_shutdown()
331 free_irq(port->irq, port); in sunplus_shutdown()
334 static void sunplus_set_termios(struct uart_port *port, in sunplus_set_termios() argument
339 u32 clk = port->uartclk; in sunplus_set_termios()
342 baud = uart_get_baud_rate(port, termios, oldtermios, 0, port->uartclk / 16); in sunplus_set_termios()
377 uart_port_lock_irqsave(port, &flags); in sunplus_set_termios()
379 uart_update_timeout(port, termios->c_cflag, baud); in sunplus_set_termios()
381 port->read_status_mask = 0; in sunplus_set_termios()
383 port->read_status_mask |= SUP_UART_LSR_PE | SUP_UART_LSR_FE; in sunplus_set_termios()
386 port->read_status_mask |= SUP_UART_LSR_BC; in sunplus_set_termios()
389 port->ignore_status_mask = 0; in sunplus_set_termios()
391 port->ignore_status_mask |= SUP_UART_LSR_FE | SUP_UART_LSR_PE; in sunplus_set_termios()
394 port->ignore_status_mask |= SUP_UART_LSR_BC; in sunplus_set_termios()
397 port->ignore_status_mask |= SUP_UART_LSR_OE; in sunplus_set_termios()
402 port->ignore_status_mask |= SUP_DUMMY_READ; in sunplus_set_termios()
404 writel(0, port->membase + SUP_UART_RX_RESIDUE); in sunplus_set_termios()
408 writel(div_h, port->membase + SUP_UART_DIV_H); in sunplus_set_termios()
409 writel(div_l, port->membase + SUP_UART_DIV_L); in sunplus_set_termios()
410 writel(lcr, port->membase + SUP_UART_LCR); in sunplus_set_termios()
412 uart_port_unlock_irqrestore(port, flags); in sunplus_set_termios()
415 static void sunplus_set_ldisc(struct uart_port *port, struct ktermios *termios) in sunplus_set_ldisc() argument
420 port->flags |= UPF_HARDPPS_CD; in sunplus_set_ldisc()
422 port->flags &= ~UPF_HARDPPS_CD; in sunplus_set_ldisc()
425 static const char *sunplus_type(struct uart_port *port) in sunplus_type() argument
427 return port->type == PORT_SUNPLUS ? "sunplus_uart" : NULL; in sunplus_type()
430 static void sunplus_config_port(struct uart_port *port, int type) in sunplus_config_port() argument
433 port->type = PORT_SUNPLUS; in sunplus_config_port()
436 static int sunplus_verify_port(struct uart_port *port, struct serial_struct *ser) in sunplus_verify_port() argument
445 static void wait_for_xmitr(struct uart_port *port) in wait_for_xmitr() argument
451 ret = readl_poll_timeout_atomic(port->membase + SUP_UART_LSR, val, in wait_for_xmitr()
455 dev_err(port->dev, "Timeout waiting while UART TX FULL\n"); in wait_for_xmitr()
462 static void sunplus_poll_put_char(struct uart_port *port, unsigned char data) in sunplus_poll_put_char() argument
464 wait_for_xmitr(port); in sunplus_poll_put_char()
465 sp_uart_put_char(port, data); in sunplus_poll_put_char()
468 static int sunplus_poll_get_char(struct uart_port *port) in sunplus_poll_get_char() argument
470 unsigned int lsr = readl(port->membase + SUP_UART_LSR); in sunplus_poll_get_char()
475 return readl(port->membase + SUP_UART_DATA); in sunplus_poll_get_char()
503 static void sunplus_uart_console_putchar(struct uart_port *port, in sunplus_uart_console_putchar() argument
506 wait_for_xmitr(port); in sunplus_uart_console_putchar()
507 sp_uart_put_char(port, ch); in sunplus_uart_console_putchar()
518 locked = uart_port_trylock_irqsave(&sunplus_console_ports[co->index]->port, &flags); in sunplus_console_write()
520 uart_port_lock_irqsave(&sunplus_console_ports[co->index]->port, &flags); in sunplus_console_write()
522 uart_console_write(&sunplus_console_ports[co->index]->port, s, count, in sunplus_console_write()
526 uart_port_unlock_irqrestore(&sunplus_console_ports[co->index]->port, flags); in sunplus_console_write()
547 return uart_set_options(&sup->port, co, baud, parity, bits, flow); in sunplus_console_setup()
589 struct uart_port *port; in sunplus_uart_probe() local
618 port = &sup->port; in sunplus_uart_probe()
620 port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in sunplus_uart_probe()
621 if (IS_ERR(port->membase)) in sunplus_uart_probe()
622 return dev_err_probe(&pdev->dev, PTR_ERR(port->membase), "membase not found\n"); in sunplus_uart_probe()
628 port->mapbase = res->start; in sunplus_uart_probe()
629 port->uartclk = clk_get_rate(sup->clk); in sunplus_uart_probe()
630 port->line = pdev->id; in sunplus_uart_probe()
631 port->irq = irq; in sunplus_uart_probe()
632 port->dev = &pdev->dev; in sunplus_uart_probe()
633 port->iotype = UPIO_MEM; in sunplus_uart_probe()
634 port->ops = &sunplus_uart_ops; in sunplus_uart_probe()
635 port->flags = UPF_BOOT_AUTOCONF; in sunplus_uart_probe()
636 port->fifosize = 128; in sunplus_uart_probe()
647 sunplus_console_ports[sup->port.line] = sup; in sunplus_uart_probe()
650 platform_set_drvdata(pdev, &sup->port); in sunplus_uart_probe()
652 ret = uart_add_one_port(&sunplus_uart_driver, &sup->port); in sunplus_uart_probe()
655 sunplus_console_ports[sup->port.line] = NULL; in sunplus_uart_probe()
665 uart_remove_one_port(&sunplus_uart_driver, &sup->port); in sunplus_uart_remove()
672 if (!uart_console(&sup->port)) in sunplus_uart_suspend()
673 uart_suspend_port(&sunplus_uart_driver, &sup->port); in sunplus_uart_suspend()
682 if (!uart_console(&sup->port)) in sunplus_uart_resume()
683 uart_resume_port(&sunplus_uart_driver, &sup->port); in sunplus_uart_resume()
732 static void sunplus_uart_putc(struct uart_port *port, unsigned char c) in sunplus_uart_putc() argument
737 ret = readl_poll_timeout_atomic(port->membase + SUP_UART_LSR, val, in sunplus_uart_putc()
742 writel(c, port->membase + SUP_UART_DATA); in sunplus_uart_putc()
749 uart_console_write(&dev->port, s, n, sunplus_uart_putc); in sunplus_uart_early_write()
755 if (!(dev->port.membase || dev->port.iobase)) in sunplus_uart_early_setup()