Lines Matching full:port
106 /* Driver data, a structure for each UART port */
126 struct uart_port *port; member
136 static struct mvebu_uart *to_mvuart(struct uart_port *port) in to_mvuart() argument
138 return (struct mvebu_uart *)port->private_data; in to_mvuart()
141 #define IS_EXTENDED(port) (to_mvuart(port)->data->is_ext) argument
143 #define UART_RBR(port) (to_mvuart(port)->data->regs.rbr) argument
144 #define UART_TSH(port) (to_mvuart(port)->data->regs.tsh) argument
145 #define UART_CTRL(port) (to_mvuart(port)->data->regs.ctrl) argument
146 #define UART_INTR(port) (to_mvuart(port)->data->regs.intr) argument
148 #define CTRL_TX_RDY_INT(port) (to_mvuart(port)->data->flags.ctrl_tx_rdy_int) argument
149 #define CTRL_RX_RDY_INT(port) (to_mvuart(port)->data->flags.ctrl_rx_rdy_int) argument
150 #define STAT_TX_RDY(port) (to_mvuart(port)->data->flags.stat_tx_rdy) argument
151 #define STAT_RX_RDY(port) (to_mvuart(port)->data->flags.stat_rx_rdy) argument
156 static unsigned int mvebu_uart_tx_empty(struct uart_port *port) in mvebu_uart_tx_empty() argument
161 spin_lock_irqsave(&port->lock, flags); in mvebu_uart_tx_empty()
162 st = readl(port->membase + UART_STAT); in mvebu_uart_tx_empty()
163 spin_unlock_irqrestore(&port->lock, flags); in mvebu_uart_tx_empty()
168 static unsigned int mvebu_uart_get_mctrl(struct uart_port *port) in mvebu_uart_get_mctrl() argument
173 static void mvebu_uart_set_mctrl(struct uart_port *port, in mvebu_uart_set_mctrl() argument
182 static void mvebu_uart_stop_tx(struct uart_port *port) in mvebu_uart_stop_tx() argument
184 unsigned int ctl = readl(port->membase + UART_INTR(port)); in mvebu_uart_stop_tx()
186 ctl &= ~CTRL_TX_RDY_INT(port); in mvebu_uart_stop_tx()
187 writel(ctl, port->membase + UART_INTR(port)); in mvebu_uart_stop_tx()
190 static void mvebu_uart_start_tx(struct uart_port *port) in mvebu_uart_start_tx() argument
193 struct circ_buf *xmit = &port->state->xmit; in mvebu_uart_start_tx()
195 if (IS_EXTENDED(port) && !uart_circ_empty(xmit)) { in mvebu_uart_start_tx()
196 writel(xmit->buf[xmit->tail], port->membase + UART_TSH(port)); in mvebu_uart_start_tx()
198 port->icount.tx++; in mvebu_uart_start_tx()
201 ctl = readl(port->membase + UART_INTR(port)); in mvebu_uart_start_tx()
202 ctl |= CTRL_TX_RDY_INT(port); in mvebu_uart_start_tx()
203 writel(ctl, port->membase + UART_INTR(port)); in mvebu_uart_start_tx()
206 static void mvebu_uart_stop_rx(struct uart_port *port) in mvebu_uart_stop_rx() argument
210 ctl = readl(port->membase + UART_CTRL(port)); in mvebu_uart_stop_rx()
212 writel(ctl, port->membase + UART_CTRL(port)); in mvebu_uart_stop_rx()
214 ctl = readl(port->membase + UART_INTR(port)); in mvebu_uart_stop_rx()
215 ctl &= ~CTRL_RX_RDY_INT(port); in mvebu_uart_stop_rx()
216 writel(ctl, port->membase + UART_INTR(port)); in mvebu_uart_stop_rx()
219 static void mvebu_uart_break_ctl(struct uart_port *port, int brk) in mvebu_uart_break_ctl() argument
224 spin_lock_irqsave(&port->lock, flags); in mvebu_uart_break_ctl()
225 ctl = readl(port->membase + UART_CTRL(port)); in mvebu_uart_break_ctl()
230 writel(ctl, port->membase + UART_CTRL(port)); in mvebu_uart_break_ctl()
231 spin_unlock_irqrestore(&port->lock, flags); in mvebu_uart_break_ctl()
234 static void mvebu_uart_rx_chars(struct uart_port *port, unsigned int status) in mvebu_uart_rx_chars() argument
236 struct tty_port *tport = &port->state->port; in mvebu_uart_rx_chars()
241 if (status & STAT_RX_RDY(port)) { in mvebu_uart_rx_chars()
242 ch = readl(port->membase + UART_RBR(port)); in mvebu_uart_rx_chars()
245 port->icount.rx++; in mvebu_uart_rx_chars()
248 port->icount.parity++; in mvebu_uart_rx_chars()
252 port->icount.brk++; in mvebu_uart_rx_chars()
254 if (uart_handle_break(port)) in mvebu_uart_rx_chars()
259 port->icount.overrun++; in mvebu_uart_rx_chars()
262 port->icount.frame++; in mvebu_uart_rx_chars()
264 if (uart_handle_sysrq_char(port, ch)) in mvebu_uart_rx_chars()
267 if (status & port->ignore_status_mask & STAT_PAR_ERR) in mvebu_uart_rx_chars()
268 status &= ~STAT_RX_RDY(port); in mvebu_uart_rx_chars()
270 status &= port->read_status_mask; in mvebu_uart_rx_chars()
275 status &= ~port->ignore_status_mask; in mvebu_uart_rx_chars()
277 if (status & STAT_RX_RDY(port)) in mvebu_uart_rx_chars()
290 status = readl(port->membase + UART_STAT); in mvebu_uart_rx_chars()
291 } while (status & (STAT_RX_RDY(port) | STAT_BRK_DET)); in mvebu_uart_rx_chars()
296 static void mvebu_uart_tx_chars(struct uart_port *port, unsigned int status) in mvebu_uart_tx_chars() argument
298 struct circ_buf *xmit = &port->state->xmit; in mvebu_uart_tx_chars()
302 if (port->x_char) { in mvebu_uart_tx_chars()
303 writel(port->x_char, port->membase + UART_TSH(port)); in mvebu_uart_tx_chars()
304 port->icount.tx++; in mvebu_uart_tx_chars()
305 port->x_char = 0; in mvebu_uart_tx_chars()
309 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { in mvebu_uart_tx_chars()
310 mvebu_uart_stop_tx(port); in mvebu_uart_tx_chars()
314 for (count = 0; count < port->fifosize; count++) { in mvebu_uart_tx_chars()
315 writel(xmit->buf[xmit->tail], port->membase + UART_TSH(port)); in mvebu_uart_tx_chars()
317 port->icount.tx++; in mvebu_uart_tx_chars()
322 st = readl(port->membase + UART_STAT); in mvebu_uart_tx_chars()
328 uart_write_wakeup(port); in mvebu_uart_tx_chars()
331 mvebu_uart_stop_tx(port); in mvebu_uart_tx_chars()
336 struct uart_port *port = (struct uart_port *)dev_id; in mvebu_uart_isr() local
337 unsigned int st = readl(port->membase + UART_STAT); in mvebu_uart_isr()
339 if (st & (STAT_RX_RDY(port) | STAT_OVR_ERR | STAT_FRM_ERR | in mvebu_uart_isr()
341 mvebu_uart_rx_chars(port, st); in mvebu_uart_isr()
343 if (st & STAT_TX_RDY(port)) in mvebu_uart_isr()
344 mvebu_uart_tx_chars(port, st); in mvebu_uart_isr()
351 struct uart_port *port = (struct uart_port *)dev_id; in mvebu_uart_rx_isr() local
352 unsigned int st = readl(port->membase + UART_STAT); in mvebu_uart_rx_isr()
354 if (st & (STAT_RX_RDY(port) | STAT_OVR_ERR | STAT_FRM_ERR | in mvebu_uart_rx_isr()
356 mvebu_uart_rx_chars(port, st); in mvebu_uart_rx_isr()
363 struct uart_port *port = (struct uart_port *)dev_id; in mvebu_uart_tx_isr() local
364 unsigned int st = readl(port->membase + UART_STAT); in mvebu_uart_tx_isr()
366 if (st & STAT_TX_RDY(port)) in mvebu_uart_tx_isr()
367 mvebu_uart_tx_chars(port, st); in mvebu_uart_tx_isr()
372 static int mvebu_uart_startup(struct uart_port *port) in mvebu_uart_startup() argument
374 struct mvebu_uart *mvuart = to_mvuart(port); in mvebu_uart_startup()
379 port->membase + UART_CTRL(port)); in mvebu_uart_startup()
383 ret = readl(port->membase + UART_STAT); in mvebu_uart_startup()
385 writel(ret, port->membase + UART_STAT); in mvebu_uart_startup()
387 writel(CTRL_BRK_INT, port->membase + UART_CTRL(port)); in mvebu_uart_startup()
389 ctl = readl(port->membase + UART_INTR(port)); in mvebu_uart_startup()
390 ctl |= CTRL_RX_RDY_INT(port); in mvebu_uart_startup()
391 writel(ctl, port->membase + UART_INTR(port)); in mvebu_uart_startup()
395 ret = devm_request_irq(port->dev, mvuart->irq[UART_IRQ_SUM], in mvebu_uart_startup()
396 mvebu_uart_isr, port->irqflags, in mvebu_uart_startup()
397 dev_name(port->dev), port); in mvebu_uart_startup()
399 dev_err(port->dev, "unable to request IRQ %d\n", in mvebu_uart_startup()
405 ret = devm_request_irq(port->dev, mvuart->irq[UART_RX_IRQ], in mvebu_uart_startup()
406 mvebu_uart_rx_isr, port->irqflags, in mvebu_uart_startup()
407 dev_name(port->dev), port); in mvebu_uart_startup()
409 dev_err(port->dev, "unable to request IRQ %d\n", in mvebu_uart_startup()
414 ret = devm_request_irq(port->dev, mvuart->irq[UART_TX_IRQ], in mvebu_uart_startup()
415 mvebu_uart_tx_isr, port->irqflags, in mvebu_uart_startup()
416 dev_name(port->dev), in mvebu_uart_startup()
417 port); in mvebu_uart_startup()
419 dev_err(port->dev, "unable to request IRQ %d\n", in mvebu_uart_startup()
421 devm_free_irq(port->dev, mvuart->irq[UART_RX_IRQ], in mvebu_uart_startup()
422 port); in mvebu_uart_startup()
430 static void mvebu_uart_shutdown(struct uart_port *port) in mvebu_uart_shutdown() argument
432 struct mvebu_uart *mvuart = to_mvuart(port); in mvebu_uart_shutdown()
434 writel(0, port->membase + UART_INTR(port)); in mvebu_uart_shutdown()
437 devm_free_irq(port->dev, mvuart->irq[UART_IRQ_SUM], port); in mvebu_uart_shutdown()
439 devm_free_irq(port->dev, mvuart->irq[UART_RX_IRQ], port); in mvebu_uart_shutdown()
440 devm_free_irq(port->dev, mvuart->irq[UART_TX_IRQ], port); in mvebu_uart_shutdown()
444 static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud) in mvebu_uart_baud_rate_set() argument
446 struct mvebu_uart *mvuart = to_mvuart(port); in mvebu_uart_baud_rate_set()
460 baud_rate_div = DIV_ROUND_UP(port->uartclk, baud * 16); in mvebu_uart_baud_rate_set()
461 brdv = readl(port->membase + UART_BRDV); in mvebu_uart_baud_rate_set()
464 writel(brdv, port->membase + UART_BRDV); in mvebu_uart_baud_rate_set()
469 static void mvebu_uart_set_termios(struct uart_port *port, in mvebu_uart_set_termios() argument
476 spin_lock_irqsave(&port->lock, flags); in mvebu_uart_set_termios()
478 port->read_status_mask = STAT_RX_RDY(port) | STAT_OVR_ERR | in mvebu_uart_set_termios()
479 STAT_TX_RDY(port) | STAT_TX_FIFO_FUL; in mvebu_uart_set_termios()
482 port->read_status_mask |= STAT_FRM_ERR | STAT_PAR_ERR; in mvebu_uart_set_termios()
484 port->ignore_status_mask = 0; in mvebu_uart_set_termios()
486 port->ignore_status_mask |= in mvebu_uart_set_termios()
490 port->ignore_status_mask |= STAT_RX_RDY(port) | STAT_BRK_ERR; in mvebu_uart_set_termios()
498 baud = uart_get_baud_rate(port, termios, old, 0, 230400); in mvebu_uart_set_termios()
499 if (mvebu_uart_baud_rate_set(port, baud)) { in mvebu_uart_set_termios()
502 baud = uart_get_baud_rate(port, old, NULL, 0, 230400); in mvebu_uart_set_termios()
505 uart_update_timeout(port, termios->c_cflag, baud); in mvebu_uart_set_termios()
517 spin_unlock_irqrestore(&port->lock, flags); in mvebu_uart_set_termios()
520 static const char *mvebu_uart_type(struct uart_port *port) in mvebu_uart_type() argument
525 static void mvebu_uart_release_port(struct uart_port *port) in mvebu_uart_release_port() argument
530 static int mvebu_uart_request_port(struct uart_port *port) in mvebu_uart_request_port() argument
536 static int mvebu_uart_get_poll_char(struct uart_port *port) in mvebu_uart_get_poll_char() argument
538 unsigned int st = readl(port->membase + UART_STAT); in mvebu_uart_get_poll_char()
540 if (!(st & STAT_RX_RDY(port))) in mvebu_uart_get_poll_char()
543 return readl(port->membase + UART_RBR(port)); in mvebu_uart_get_poll_char()
546 static void mvebu_uart_put_poll_char(struct uart_port *port, unsigned char c) in mvebu_uart_put_poll_char() argument
551 st = readl(port->membase + UART_STAT); in mvebu_uart_put_poll_char()
559 writel(c, port->membase + UART_TSH(port)); in mvebu_uart_put_poll_char()
587 static void mvebu_uart_putc(struct uart_port *port, int c) in mvebu_uart_putc() argument
592 st = readl(port->membase + UART_STAT); in mvebu_uart_putc()
598 writel(c, port->membase + UART_STD_TSH); in mvebu_uart_putc()
601 st = readl(port->membase + UART_STAT); in mvebu_uart_putc()
613 uart_console_write(&dev->port, s, n, mvebu_uart_putc); in mvebu_uart_putc_early_write()
620 if (!device->port.membase) in mvebu_uart_early_console_setup()
632 static void wait_for_xmitr(struct uart_port *port) in wait_for_xmitr() argument
636 readl_poll_timeout_atomic(port->membase + UART_STAT, val, in wait_for_xmitr()
637 (val & STAT_TX_RDY(port)), 1, 10000); in wait_for_xmitr()
640 static void mvebu_uart_console_putchar(struct uart_port *port, int ch) in mvebu_uart_console_putchar() argument
642 wait_for_xmitr(port); in mvebu_uart_console_putchar()
643 writel(ch, port->membase + UART_TSH(port)); in mvebu_uart_console_putchar()
649 struct uart_port *port = &mvebu_uart_ports[co->index]; in mvebu_uart_console_write() local
655 locked = spin_trylock_irqsave(&port->lock, flags); in mvebu_uart_console_write()
657 spin_lock_irqsave(&port->lock, flags); in mvebu_uart_console_write()
659 ier = readl(port->membase + UART_CTRL(port)) & CTRL_BRK_INT; in mvebu_uart_console_write()
660 intr = readl(port->membase + UART_INTR(port)) & in mvebu_uart_console_write()
661 (CTRL_RX_RDY_INT(port) | CTRL_TX_RDY_INT(port)); in mvebu_uart_console_write()
662 writel(0, port->membase + UART_CTRL(port)); in mvebu_uart_console_write()
663 writel(0, port->membase + UART_INTR(port)); in mvebu_uart_console_write()
665 uart_console_write(port, s, count, mvebu_uart_console_putchar); in mvebu_uart_console_write()
667 wait_for_xmitr(port); in mvebu_uart_console_write()
670 writel(ier, port->membase + UART_CTRL(port)); in mvebu_uart_console_write()
673 ctl = intr | readl(port->membase + UART_INTR(port)); in mvebu_uart_console_write()
674 writel(ctl, port->membase + UART_INTR(port)); in mvebu_uart_console_write()
678 spin_unlock_irqrestore(&port->lock, flags); in mvebu_uart_console_write()
683 struct uart_port *port; in mvebu_uart_console_setup() local
692 port = &mvebu_uart_ports[co->index]; in mvebu_uart_console_setup()
694 if (!port->mapbase || !port->membase) { in mvebu_uart_console_setup()
702 return uart_set_options(port, co, baud, parity, bits, flow); in mvebu_uart_console_setup()
742 struct uart_port *port = mvuart->port; in mvebu_uart_suspend() local
744 uart_suspend_port(&mvebu_uart_driver, port); in mvebu_uart_suspend()
746 mvuart->pm_regs.rbr = readl(port->membase + UART_RBR(port)); in mvebu_uart_suspend()
747 mvuart->pm_regs.tsh = readl(port->membase + UART_TSH(port)); in mvebu_uart_suspend()
748 mvuart->pm_regs.ctrl = readl(port->membase + UART_CTRL(port)); in mvebu_uart_suspend()
749 mvuart->pm_regs.intr = readl(port->membase + UART_INTR(port)); in mvebu_uart_suspend()
750 mvuart->pm_regs.stat = readl(port->membase + UART_STAT); in mvebu_uart_suspend()
751 mvuart->pm_regs.brdv = readl(port->membase + UART_BRDV); in mvebu_uart_suspend()
752 mvuart->pm_regs.osamp = readl(port->membase + UART_OSAMP); in mvebu_uart_suspend()
762 struct uart_port *port = mvuart->port; in mvebu_uart_resume() local
764 writel(mvuart->pm_regs.rbr, port->membase + UART_RBR(port)); in mvebu_uart_resume()
765 writel(mvuart->pm_regs.tsh, port->membase + UART_TSH(port)); in mvebu_uart_resume()
766 writel(mvuart->pm_regs.ctrl, port->membase + UART_CTRL(port)); in mvebu_uart_resume()
767 writel(mvuart->pm_regs.intr, port->membase + UART_INTR(port)); in mvebu_uart_resume()
768 writel(mvuart->pm_regs.stat, port->membase + UART_STAT); in mvebu_uart_resume()
769 writel(mvuart->pm_regs.brdv, port->membase + UART_BRDV); in mvebu_uart_resume()
770 writel(mvuart->pm_regs.osamp, port->membase + UART_OSAMP); in mvebu_uart_resume()
772 uart_resume_port(&mvebu_uart_driver, port); in mvebu_uart_resume()
785 /* Counter to keep track of each UART port id when not using CONFIG_OF */
793 struct uart_port *port; in mvebu_uart_probe() local
818 port = &mvebu_uart_ports[pdev->id]; in mvebu_uart_probe()
820 spin_lock_init(&port->lock); in mvebu_uart_probe()
822 port->dev = &pdev->dev; in mvebu_uart_probe()
823 port->type = PORT_MVEBU; in mvebu_uart_probe()
824 port->ops = &mvebu_uart_ops; in mvebu_uart_probe()
825 port->regshift = 0; in mvebu_uart_probe()
827 port->fifosize = 32; in mvebu_uart_probe()
828 port->iotype = UPIO_MEM32; in mvebu_uart_probe()
829 port->flags = UPF_FIXED_PORT; in mvebu_uart_probe()
830 port->line = pdev->id; in mvebu_uart_probe()
834 * them per port (RX and TX). Instead, use the driver UART structure in mvebu_uart_probe()
837 port->irq = 0; in mvebu_uart_probe()
838 port->irqflags = 0; in mvebu_uart_probe()
839 port->mapbase = reg->start; in mvebu_uart_probe()
841 port->membase = devm_ioremap_resource(&pdev->dev, reg); in mvebu_uart_probe()
842 if (IS_ERR(port->membase)) in mvebu_uart_probe()
843 return PTR_ERR(port->membase); in mvebu_uart_probe()
852 mvuart->port = port; in mvebu_uart_probe()
854 port->private_data = mvuart; in mvebu_uart_probe()
863 if (IS_EXTENDED(port)) { in mvebu_uart_probe()
869 port->uartclk = clk_get_rate(mvuart->clk); in mvebu_uart_probe()
886 * uart-sum of UART0 port. in mvebu_uart_probe()
906 writel(CTRL_SOFT_RST, port->membase + UART_CTRL(port)); in mvebu_uart_probe()
908 writel(0, port->membase + UART_CTRL(port)); in mvebu_uart_probe()
910 ret = uart_add_one_port(&mvebu_uart_driver, port); in mvebu_uart_probe()