Lines Matching refs:port
89 static void meson_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) in meson_uart_set_mctrl() argument
93 static unsigned int meson_uart_get_mctrl(struct uart_port *port) in meson_uart_get_mctrl() argument
98 static unsigned int meson_uart_tx_empty(struct uart_port *port) in meson_uart_tx_empty() argument
102 val = readl(port->membase + AML_UART_STATUS); in meson_uart_tx_empty()
106 static void meson_uart_stop_tx(struct uart_port *port) in meson_uart_stop_tx() argument
110 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_stop_tx()
112 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_stop_tx()
115 static void meson_uart_stop_rx(struct uart_port *port) in meson_uart_stop_rx() argument
119 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_stop_rx()
121 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_stop_rx()
124 static void meson_uart_shutdown(struct uart_port *port) in meson_uart_shutdown() argument
129 free_irq(port->irq, port); in meson_uart_shutdown()
131 spin_lock_irqsave(&port->lock, flags); in meson_uart_shutdown()
133 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_shutdown()
136 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_shutdown()
138 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_shutdown()
141 static void meson_uart_start_tx(struct uart_port *port) in meson_uart_start_tx() argument
143 struct circ_buf *xmit = &port->state->xmit; in meson_uart_start_tx()
146 if (uart_tx_stopped(port)) { in meson_uart_start_tx()
147 meson_uart_stop_tx(port); in meson_uart_start_tx()
151 while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL)) { in meson_uart_start_tx()
152 if (port->x_char) { in meson_uart_start_tx()
153 writel(port->x_char, port->membase + AML_UART_WFIFO); in meson_uart_start_tx()
154 port->icount.tx++; in meson_uart_start_tx()
155 port->x_char = 0; in meson_uart_start_tx()
163 writel(ch, port->membase + AML_UART_WFIFO); in meson_uart_start_tx()
165 port->icount.tx++; in meson_uart_start_tx()
169 uart_write_wakeup(port); in meson_uart_start_tx()
172 static void meson_receive_chars(struct uart_port *port) in meson_receive_chars() argument
174 struct tty_port *tport = &port->state->port; in meson_receive_chars()
180 port->icount.rx++; in meson_receive_chars()
181 status = readl(port->membase + AML_UART_STATUS); in meson_receive_chars()
185 port->icount.overrun++; in meson_receive_chars()
187 port->icount.frame++; in meson_receive_chars()
189 port->icount.frame++; in meson_receive_chars()
191 mode = readl(port->membase + AML_UART_CONTROL); in meson_receive_chars()
193 writel(mode, port->membase + AML_UART_CONTROL); in meson_receive_chars()
197 writel(mode, port->membase + AML_UART_CONTROL); in meson_receive_chars()
199 status &= port->read_status_mask; in meson_receive_chars()
206 ch = readl(port->membase + AML_UART_RFIFO); in meson_receive_chars()
209 if ((status & port->ignore_status_mask) == 0) in meson_receive_chars()
215 } while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)); in meson_receive_chars()
217 spin_unlock(&port->lock); in meson_receive_chars()
219 spin_lock(&port->lock); in meson_receive_chars()
224 struct uart_port *port = (struct uart_port *)dev_id; in meson_uart_interrupt() local
226 spin_lock(&port->lock); in meson_uart_interrupt()
228 if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)) in meson_uart_interrupt()
229 meson_receive_chars(port); in meson_uart_interrupt()
231 if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL)) in meson_uart_interrupt()
232 meson_uart_start_tx(port); in meson_uart_interrupt()
234 spin_unlock(&port->lock); in meson_uart_interrupt()
239 static const char *meson_uart_type(struct uart_port *port) in meson_uart_type() argument
241 return (port->type == PORT_MESON) ? "meson_uart" : NULL; in meson_uart_type()
244 static int meson_uart_startup(struct uart_port *port) in meson_uart_startup() argument
249 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_startup()
251 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
254 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
257 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
260 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
262 val = (AML_UART_RECV_IRQ(1) | AML_UART_XMIT_IRQ(port->fifosize / 2)); in meson_uart_startup()
263 writel(val, port->membase + AML_UART_MISC); in meson_uart_startup()
265 ret = request_irq(port->irq, meson_uart_interrupt, 0, in meson_uart_startup()
266 meson_uart_type(port), port); in meson_uart_startup()
271 static void meson_uart_change_speed(struct uart_port *port, unsigned long baud) in meson_uart_change_speed() argument
275 while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_EMPTY)) in meson_uart_change_speed()
278 val = readl(port->membase + AML_UART_REG5); in meson_uart_change_speed()
280 val = ((port->uartclk * 10 / (baud * 4) + 5) / 10) - 1; in meson_uart_change_speed()
282 writel(val, port->membase + AML_UART_REG5); in meson_uart_change_speed()
285 static void meson_uart_set_termios(struct uart_port *port, in meson_uart_set_termios() argument
293 spin_lock_irqsave(&port->lock, flags); in meson_uart_set_termios()
298 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_set_termios()
337 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_set_termios()
339 baud = uart_get_baud_rate(port, termios, old, 9600, 115200); in meson_uart_set_termios()
340 meson_uart_change_speed(port, baud); in meson_uart_set_termios()
342 port->read_status_mask = AML_UART_TX_FIFO_WERR; in meson_uart_set_termios()
344 port->read_status_mask |= AML_UART_PARITY_ERR | in meson_uart_set_termios()
347 port->ignore_status_mask = 0; in meson_uart_set_termios()
349 port->ignore_status_mask |= AML_UART_PARITY_ERR | in meson_uart_set_termios()
352 uart_update_timeout(port, termios->c_cflag, baud); in meson_uart_set_termios()
353 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_set_termios()
356 static int meson_uart_verify_port(struct uart_port *port, in meson_uart_verify_port() argument
361 if (port->type != PORT_MESON) in meson_uart_verify_port()
363 if (port->irq != ser->irq) in meson_uart_verify_port()
370 static void meson_uart_release_port(struct uart_port *port) in meson_uart_release_port() argument
372 if (port->flags & UPF_IOREMAP) { in meson_uart_release_port()
373 iounmap(port->membase); in meson_uart_release_port()
374 port->membase = NULL; in meson_uart_release_port()
378 static int meson_uart_request_port(struct uart_port *port) in meson_uart_request_port() argument
380 struct platform_device *pdev = to_platform_device(port->dev); in meson_uart_request_port()
391 if (!devm_request_mem_region(port->dev, port->mapbase, size, in meson_uart_request_port()
392 dev_name(port->dev))) { in meson_uart_request_port()
393 dev_err(port->dev, "Memory region busy\n"); in meson_uart_request_port()
397 if (port->flags & UPF_IOREMAP) { in meson_uart_request_port()
398 port->membase = devm_ioremap_nocache(port->dev, in meson_uart_request_port()
399 port->mapbase, in meson_uart_request_port()
401 if (port->membase == NULL) in meson_uart_request_port()
408 static void meson_uart_config_port(struct uart_port *port, int flags) in meson_uart_config_port() argument
411 port->type = PORT_MESON; in meson_uart_config_port()
412 meson_uart_request_port(port); in meson_uart_config_port()
435 static void meson_console_putchar(struct uart_port *port, int ch) in meson_console_putchar() argument
437 if (!port->membase) in meson_console_putchar()
440 while (readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL) in meson_console_putchar()
442 writel(ch, port->membase + AML_UART_WFIFO); in meson_console_putchar()
448 struct uart_port *port; in meson_serial_console_write() local
452 port = meson_ports[co->index]; in meson_serial_console_write()
453 if (!port) in meson_serial_console_write()
457 if (port->sysrq) { in meson_serial_console_write()
460 locked = spin_trylock(&port->lock); in meson_serial_console_write()
462 spin_lock(&port->lock); in meson_serial_console_write()
466 uart_console_write(port, s, count, meson_console_putchar); in meson_serial_console_write()
469 spin_unlock(&port->lock); in meson_serial_console_write()
475 struct uart_port *port; in meson_serial_console_setup() local
484 port = meson_ports[co->index]; in meson_serial_console_setup()
485 if (!port || !port->membase) in meson_serial_console_setup()
491 return uart_set_options(port, co, baud, parity, bits, flow); in meson_serial_console_setup()
527 struct uart_port *port; in meson_uart_probe() local
550 port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL); in meson_uart_probe()
551 if (!port) in meson_uart_probe()
558 port->uartclk = clk_get_rate(clk); in meson_uart_probe()
559 port->iotype = UPIO_MEM; in meson_uart_probe()
560 port->mapbase = res_mem->start; in meson_uart_probe()
561 port->irq = res_irq->start; in meson_uart_probe()
562 port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_LOW_LATENCY; in meson_uart_probe()
563 port->dev = &pdev->dev; in meson_uart_probe()
564 port->line = pdev->id; in meson_uart_probe()
565 port->type = PORT_MESON; in meson_uart_probe()
566 port->x_char = 0; in meson_uart_probe()
567 port->ops = &meson_uart_ops; in meson_uart_probe()
568 port->fifosize = 64; in meson_uart_probe()
570 meson_ports[pdev->id] = port; in meson_uart_probe()
571 platform_set_drvdata(pdev, port); in meson_uart_probe()
573 ret = uart_add_one_port(&meson_uart_driver, port); in meson_uart_probe()
582 struct uart_port *port; in meson_uart_remove() local
584 port = platform_get_drvdata(pdev); in meson_uart_remove()
585 uart_remove_one_port(&meson_uart_driver, port); in meson_uart_remove()