Lines Matching +full:uart +full:- +full:fifosize

1 // SPDX-License-Identifier: GPL-2.0
102 val = readl(port->membase + AML_UART_STATUS); in meson_uart_tx_empty()
111 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_stop_tx()
113 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_stop_tx()
120 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_stop_rx()
122 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_stop_rx()
130 free_irq(port->irq, port); in meson_uart_shutdown()
132 spin_lock_irqsave(&port->lock, flags); in meson_uart_shutdown()
134 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_shutdown()
137 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_shutdown()
139 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_shutdown()
144 struct circ_buf *xmit = &port->state->xmit; in meson_uart_start_tx()
153 while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL)) { in meson_uart_start_tx()
154 if (port->x_char) { in meson_uart_start_tx()
155 writel(port->x_char, port->membase + AML_UART_WFIFO); in meson_uart_start_tx()
156 port->icount.tx++; in meson_uart_start_tx()
157 port->x_char = 0; in meson_uart_start_tx()
164 ch = xmit->buf[xmit->tail]; in meson_uart_start_tx()
165 writel(ch, port->membase + AML_UART_WFIFO); in meson_uart_start_tx()
170 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_start_tx()
172 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_start_tx()
181 struct tty_port *tport = &port->state->port; in meson_receive_chars()
187 port->icount.rx++; in meson_receive_chars()
188 ostatus = status = readl(port->membase + AML_UART_STATUS); in meson_receive_chars()
192 port->icount.overrun++; in meson_receive_chars()
194 port->icount.frame++; in meson_receive_chars()
196 port->icount.frame++; in meson_receive_chars()
198 mode = readl(port->membase + AML_UART_CONTROL); in meson_receive_chars()
200 writel(mode, port->membase + AML_UART_CONTROL); in meson_receive_chars()
204 writel(mode, port->membase + AML_UART_CONTROL); in meson_receive_chars()
206 status &= port->read_status_mask; in meson_receive_chars()
213 ch = readl(port->membase + AML_UART_RFIFO); in meson_receive_chars()
217 port->icount.brk++; in meson_receive_chars()
226 if ((status & port->ignore_status_mask) == 0) in meson_receive_chars()
232 } while (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)); in meson_receive_chars()
241 spin_lock(&port->lock); in meson_uart_interrupt()
243 if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)) in meson_uart_interrupt()
246 if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL)) { in meson_uart_interrupt()
247 if (readl(port->membase + AML_UART_CONTROL) & AML_UART_TX_INT_EN) in meson_uart_interrupt()
251 spin_unlock(&port->lock); in meson_uart_interrupt()
258 return (port->type == PORT_MESON) ? "meson_uart" : NULL; in meson_uart_type()
266 * function to acquire the port->lock. (Since there is no console on this
267 * port at this time, the port->lock is not initialized yet.)
273 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_reset()
275 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_reset()
278 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_reset()
287 spin_lock_irqsave(&port->lock, flags); in meson_uart_startup()
289 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_startup()
291 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
293 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
296 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
299 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_startup()
301 val = (AML_UART_RECV_IRQ(1) | AML_UART_XMIT_IRQ(port->fifosize / 2)); in meson_uart_startup()
302 writel(val, port->membase + AML_UART_MISC); in meson_uart_startup()
304 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_startup()
306 ret = request_irq(port->irq, meson_uart_interrupt, 0, in meson_uart_startup()
307 port->name, port); in meson_uart_startup()
314 const struct meson_uart_data *private_data = port->private_data; in meson_uart_change_speed()
320 if (port->uartclk == 24000000) { in meson_uart_change_speed()
323 if (private_data && private_data->has_xtal_div2) { in meson_uart_change_speed()
327 val |= DIV_ROUND_CLOSEST(port->uartclk / xtal_div, baud) - 1; in meson_uart_change_speed()
330 val = DIV_ROUND_CLOSEST(port->uartclk / 4, baud) - 1; in meson_uart_change_speed()
333 writel(val, port->membase + AML_UART_REG5); in meson_uart_change_speed()
344 spin_lock_irqsave(&port->lock, flags); in meson_uart_set_termios()
346 cflags = termios->c_cflag; in meson_uart_set_termios()
347 iflags = termios->c_iflag; in meson_uart_set_termios()
349 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_set_termios()
384 if (port->flags & UPF_HARD_FLOW) in meson_uart_set_termios()
387 termios->c_cflag &= ~CRTSCTS; in meson_uart_set_termios()
392 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_set_termios()
397 port->read_status_mask = AML_UART_TX_FIFO_WERR; in meson_uart_set_termios()
399 port->read_status_mask |= AML_UART_PARITY_ERR | in meson_uart_set_termios()
402 port->ignore_status_mask = 0; in meson_uart_set_termios()
404 port->ignore_status_mask |= AML_UART_PARITY_ERR | in meson_uart_set_termios()
407 uart_update_timeout(port, termios->c_cflag, baud); in meson_uart_set_termios()
408 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_set_termios()
416 if (port->type != PORT_MESON) in meson_uart_verify_port()
417 ret = -EINVAL; in meson_uart_verify_port()
418 if (port->irq != ser->irq) in meson_uart_verify_port()
419 ret = -EINVAL; in meson_uart_verify_port()
420 if (ser->baud_base < 9600) in meson_uart_verify_port()
421 ret = -EINVAL; in meson_uart_verify_port()
427 devm_iounmap(port->dev, port->membase); in meson_uart_release_port()
428 port->membase = NULL; in meson_uart_release_port()
429 devm_release_mem_region(port->dev, port->mapbase, port->mapsize); in meson_uart_release_port()
434 if (!devm_request_mem_region(port->dev, port->mapbase, port->mapsize, in meson_uart_request_port()
435 dev_name(port->dev))) { in meson_uart_request_port()
436 dev_err(port->dev, "Memory region busy\n"); in meson_uart_request_port()
437 return -EBUSY; in meson_uart_request_port()
440 port->membase = devm_ioremap(port->dev, port->mapbase, in meson_uart_request_port()
441 port->mapsize); in meson_uart_request_port()
442 if (!port->membase) in meson_uart_request_port()
443 return -ENOMEM; in meson_uart_request_port()
451 port->type = PORT_MESON; in meson_uart_config_port()
458 * Console polling routines for writing and reading from the uart while
467 spin_lock_irqsave(&port->lock, flags); in meson_uart_poll_get_char()
469 if (readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY) in meson_uart_poll_get_char()
472 c = readl(port->membase + AML_UART_RFIFO); in meson_uart_poll_get_char()
474 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_poll_get_char()
485 spin_lock_irqsave(&port->lock, flags); in meson_uart_poll_put_char()
488 ret = readl_poll_timeout_atomic(port->membase + AML_UART_STATUS, reg, in meson_uart_poll_put_char()
492 if (ret == -ETIMEDOUT) { in meson_uart_poll_put_char()
493 dev_err(port->dev, "Timeout waiting for UART TX EMPTY\n"); in meson_uart_poll_put_char()
498 writel(c, port->membase + AML_UART_WFIFO); in meson_uart_poll_put_char()
501 ret = readl_poll_timeout_atomic(port->membase + AML_UART_STATUS, reg, in meson_uart_poll_put_char()
505 if (ret == -ETIMEDOUT) in meson_uart_poll_put_char()
506 dev_err(port->dev, "Timeout waiting for UART TX EMPTY\n"); in meson_uart_poll_put_char()
509 spin_unlock_irqrestore(&port->lock, flags); in meson_uart_poll_put_char()
540 val = readl(port->membase + AML_UART_CONTROL); in meson_uart_enable_tx_engine()
542 writel(val, port->membase + AML_UART_CONTROL); in meson_uart_enable_tx_engine()
547 if (!port->membase) in meson_console_putchar()
550 while (readl(port->membase + AML_UART_STATUS) & AML_UART_TX_FULL) in meson_console_putchar()
552 writel(ch, port->membase + AML_UART_WFIFO); in meson_console_putchar()
563 if (port->sysrq) { in meson_serial_port_write()
566 locked = spin_trylock(&port->lock); in meson_serial_port_write()
568 spin_lock(&port->lock); in meson_serial_port_write()
572 val = readl(port->membase + AML_UART_CONTROL); in meson_serial_port_write()
574 writel(tmp, port->membase + AML_UART_CONTROL); in meson_serial_port_write()
577 writel(val, port->membase + AML_UART_CONTROL); in meson_serial_port_write()
580 spin_unlock(&port->lock); in meson_serial_port_write()
589 port = meson_ports[co->index]; in meson_serial_console_write()
604 if (co->index < 0 || co->index >= AML_UART_PORT_NUM) in meson_serial_console_setup()
605 return -EINVAL; in meson_serial_console_setup()
607 port = meson_ports[co->index]; in meson_serial_console_setup()
608 if (!port || !port->membase) in meson_serial_console_setup()
609 return -ENODEV; in meson_serial_console_setup()
626 .index = -1, \
637 struct earlycon_device *dev = co->data; in meson_serial_early_console_write()
639 meson_serial_port_write(&dev->port, s, count); in meson_serial_early_console_write()
645 if (!device->port.membase) in meson_serial_early_console_setup()
646 return -ENODEV; in meson_serial_early_console_setup()
648 meson_uart_enable_tx_engine(&device->port); in meson_serial_early_console_setup()
649 device->con->write = meson_serial_early_console_write; in meson_serial_early_console_setup()
653 OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart",
680 clk_pclk = devm_clk_get_enabled(&pdev->dev, "pclk"); in meson_uart_probe_clocks()
684 clk_xtal = devm_clk_get_enabled(&pdev->dev, "xtal"); in meson_uart_probe_clocks()
688 clk_baud = devm_clk_get_enabled(&pdev->dev, "baud"); in meson_uart_probe_clocks()
692 port->uartclk = clk_get_rate(clk_baud); in meson_uart_probe_clocks()
699 return (pd && pd->uart_driver) ? in meson_uart_current()
700 pd->uart_driver : &meson_uart_driver_ttyAML; in meson_uart_current()
709 u32 fifosize = 64; /* Default is 64, 128 for EE UART_0 */ in meson_uart_probe() local
714 if (pdev->dev.of_node) in meson_uart_probe()
715 pdev->id = of_alias_get_id(pdev->dev.of_node, "serial"); in meson_uart_probe()
717 if (pdev->id < 0) { in meson_uart_probe()
722 pdev->id = id; in meson_uart_probe()
728 if (pdev->id < 0 || pdev->id >= AML_UART_PORT_NUM) in meson_uart_probe()
729 return -EINVAL; in meson_uart_probe()
733 return -ENODEV; in meson_uart_probe()
739 of_property_read_u32(pdev->dev.of_node, "fifo-size", &fifosize); in meson_uart_probe()
740 has_rtscts = of_property_read_bool(pdev->dev.of_node, "uart-has-rtscts"); in meson_uart_probe()
742 if (meson_ports[pdev->id]) { in meson_uart_probe()
743 return dev_err_probe(&pdev->dev, -EBUSY, in meson_uart_probe()
744 "port %d already allocated\n", pdev->id); in meson_uart_probe()
747 port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL); in meson_uart_probe()
749 return -ENOMEM; in meson_uart_probe()
755 priv_data = device_get_match_data(&pdev->dev); in meson_uart_probe()
759 if (!uart_driver->state) { in meson_uart_probe()
762 return dev_err_probe(&pdev->dev, ret, in meson_uart_probe()
763 "can't register uart driver\n"); in meson_uart_probe()
766 port->iotype = UPIO_MEM; in meson_uart_probe()
767 port->mapbase = res_mem->start; in meson_uart_probe()
768 port->mapsize = resource_size(res_mem); in meson_uart_probe()
769 port->irq = irq; in meson_uart_probe()
770 port->flags = UPF_BOOT_AUTOCONF | UPF_LOW_LATENCY; in meson_uart_probe()
772 port->flags |= UPF_HARD_FLOW; in meson_uart_probe()
773 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_MESON_CONSOLE); in meson_uart_probe()
774 port->dev = &pdev->dev; in meson_uart_probe()
775 port->line = pdev->id; in meson_uart_probe()
776 port->type = PORT_MESON; in meson_uart_probe()
777 port->x_char = 0; in meson_uart_probe()
778 port->ops = &meson_uart_ops; in meson_uart_probe()
779 port->fifosize = fifosize; in meson_uart_probe()
780 port->private_data = (void *)priv_data; in meson_uart_probe()
782 meson_ports[pdev->id] = port; in meson_uart_probe()
793 meson_ports[pdev->id] = NULL; in meson_uart_probe()
804 uart_driver = meson_uart_current(port->private_data); in meson_uart_remove()
806 meson_ports[pdev->id] = NULL; in meson_uart_remove()
812 /* No more available uart ports, unregister uart driver */ in meson_uart_remove()
833 { .compatible = "amlogic,meson6-uart" },
834 { .compatible = "amlogic,meson8-uart" },
835 { .compatible = "amlogic,meson8b-uart" },
836 { .compatible = "amlogic,meson-gx-uart" },
838 .compatible = "amlogic,meson-g12a-uart",
842 .compatible = "amlogic,meson-s4-uart",
846 .compatible = "amlogic,meson-a1-uart",