Lines Matching +full:port +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #define DRIVER_NAME "esp32-uart"
93 struct uart_port port; member
128 .compatible = "esp,esp32-uart",
131 .compatible = "esp,esp32s3-uart",
139 static const struct esp32_uart_variant *port_variant(struct uart_port *port) in port_variant() argument
141 return port->private_data; in port_variant()
144 static void esp32_uart_write(struct uart_port *port, unsigned long reg, u32 v) in esp32_uart_write() argument
146 writel(v, port->membase + reg); in esp32_uart_write()
149 static u32 esp32_uart_read(struct uart_port *port, unsigned long reg) in esp32_uart_read() argument
151 return readl(port->membase + reg); in esp32_uart_read()
154 static u32 esp32_uart_tx_fifo_cnt(struct uart_port *port) in esp32_uart_tx_fifo_cnt() argument
156 u32 status = esp32_uart_read(port, UART_STATUS_REG); in esp32_uart_tx_fifo_cnt()
158 return (status & port_variant(port)->txfifo_cnt_mask) >> UART_TXFIFO_CNT_SHIFT; in esp32_uart_tx_fifo_cnt()
161 static u32 esp32_uart_rx_fifo_cnt(struct uart_port *port) in esp32_uart_rx_fifo_cnt() argument
163 u32 status = esp32_uart_read(port, UART_STATUS_REG); in esp32_uart_rx_fifo_cnt()
165 return (status & port_variant(port)->rxfifo_cnt_mask) >> UART_RXFIFO_CNT_SHIFT; in esp32_uart_rx_fifo_cnt()
169 static unsigned int esp32_uart_tx_empty(struct uart_port *port) in esp32_uart_tx_empty() argument
171 return esp32_uart_tx_fifo_cnt(port) ? 0 : TIOCSER_TEMT; in esp32_uart_tx_empty()
174 static void esp32_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) in esp32_uart_set_mctrl() argument
176 u32 conf0 = esp32_uart_read(port, UART_CONF0_REG); in esp32_uart_set_mctrl()
189 esp32_uart_write(port, UART_CONF0_REG, conf0); in esp32_uart_set_mctrl()
192 static unsigned int esp32_uart_get_mctrl(struct uart_port *port) in esp32_uart_get_mctrl() argument
194 u32 status = esp32_uart_read(port, UART_STATUS_REG); in esp32_uart_get_mctrl()
205 static void esp32_uart_stop_tx(struct uart_port *port) in esp32_uart_stop_tx() argument
209 int_ena = esp32_uart_read(port, UART_INT_ENA_REG); in esp32_uart_stop_tx()
211 esp32_uart_write(port, UART_INT_ENA_REG, int_ena); in esp32_uart_stop_tx()
214 static void esp32_uart_rxint(struct uart_port *port) in esp32_uart_rxint() argument
216 struct tty_port *tty_port = &port->state->port; in esp32_uart_rxint()
217 u32 rx_fifo_cnt = esp32_uart_rx_fifo_cnt(port); in esp32_uart_rxint()
224 spin_lock_irqsave(&port->lock, flags); in esp32_uart_rxint()
227 u32 rx = esp32_uart_read(port, UART_FIFO_REG); in esp32_uart_rxint()
230 (esp32_uart_read(port, UART_INT_ST_REG) & UART_BRK_DET_INT)) { in esp32_uart_rxint()
231 esp32_uart_write(port, UART_INT_CLR_REG, UART_BRK_DET_INT); in esp32_uart_rxint()
232 ++port->icount.brk; in esp32_uart_rxint()
233 uart_handle_break(port); in esp32_uart_rxint()
235 if (uart_handle_sysrq_char(port, (unsigned char)rx)) in esp32_uart_rxint()
238 ++port->icount.rx; in esp32_uart_rxint()
241 spin_unlock_irqrestore(&port->lock, flags); in esp32_uart_rxint()
246 static void esp32_uart_put_char(struct uart_port *port, u8 c) in esp32_uart_put_char() argument
248 esp32_uart_write(port, UART_FIFO_REG, c); in esp32_uart_put_char()
251 static void esp32_uart_put_char_sync(struct uart_port *port, u8 c) in esp32_uart_put_char_sync() argument
255 while (esp32_uart_tx_fifo_cnt(port) >= ESP32_UART_TX_FIFO_SIZE) { in esp32_uart_put_char_sync()
257 dev_warn(port->dev, "timeout waiting for TX FIFO\n"); in esp32_uart_put_char_sync()
262 esp32_uart_put_char(port, c); in esp32_uart_put_char_sync()
265 static void esp32_uart_transmit_buffer(struct uart_port *port) in esp32_uart_transmit_buffer() argument
267 u32 tx_fifo_used = esp32_uart_tx_fifo_cnt(port); in esp32_uart_transmit_buffer()
274 pending = uart_port_tx_limited(port, ch, in esp32_uart_transmit_buffer()
275 ESP32_UART_TX_FIFO_SIZE - tx_fifo_used, in esp32_uart_transmit_buffer()
276 true, esp32_uart_put_char(port, ch), in esp32_uart_transmit_buffer()
281 int_ena = esp32_uart_read(port, UART_INT_ENA_REG); in esp32_uart_transmit_buffer()
283 esp32_uart_write(port, UART_INT_ENA_REG, int_ena); in esp32_uart_transmit_buffer()
287 static void esp32_uart_txint(struct uart_port *port) in esp32_uart_txint() argument
289 esp32_uart_transmit_buffer(port); in esp32_uart_txint()
294 struct uart_port *port = dev_id; in esp32_uart_int() local
297 status = esp32_uart_read(port, UART_INT_ST_REG); in esp32_uart_int()
300 esp32_uart_rxint(port); in esp32_uart_int()
302 esp32_uart_txint(port); in esp32_uart_int()
304 esp32_uart_write(port, UART_INT_CLR_REG, status); in esp32_uart_int()
309 static void esp32_uart_start_tx(struct uart_port *port) in esp32_uart_start_tx() argument
311 esp32_uart_transmit_buffer(port); in esp32_uart_start_tx()
314 static void esp32_uart_stop_rx(struct uart_port *port) in esp32_uart_stop_rx() argument
318 int_ena = esp32_uart_read(port, UART_INT_ENA_REG); in esp32_uart_stop_rx()
320 esp32_uart_write(port, UART_INT_ENA_REG, int_ena); in esp32_uart_stop_rx()
323 static int esp32_uart_startup(struct uart_port *port) in esp32_uart_startup() argument
327 struct esp32_port *sport = container_of(port, struct esp32_port, port); in esp32_uart_startup()
329 ret = clk_prepare_enable(sport->clk); in esp32_uart_startup()
333 ret = request_irq(port->irq, esp32_uart_int, 0, DRIVER_NAME, port); in esp32_uart_startup()
335 clk_disable_unprepare(sport->clk); in esp32_uart_startup()
339 spin_lock_irqsave(&port->lock, flags); in esp32_uart_startup()
340 if (port_variant(port)->has_clkconf) in esp32_uart_startup()
341 esp32_uart_write(port, ESP32S3_UART_CLK_CONF_REG, in esp32_uart_startup()
343 esp32_uart_write(port, UART_CONF1_REG, in esp32_uart_startup()
345 (1 << port_variant(port)->txfifo_empty_thrhd_shift)); in esp32_uart_startup()
346 esp32_uart_write(port, UART_INT_CLR_REG, UART_RXFIFO_FULL_INT | UART_BRK_DET_INT); in esp32_uart_startup()
347 esp32_uart_write(port, UART_INT_ENA_REG, UART_RXFIFO_FULL_INT | UART_BRK_DET_INT); in esp32_uart_startup()
348 spin_unlock_irqrestore(&port->lock, flags); in esp32_uart_startup()
353 static void esp32_uart_shutdown(struct uart_port *port) in esp32_uart_shutdown() argument
355 struct esp32_port *sport = container_of(port, struct esp32_port, port); in esp32_uart_shutdown()
357 esp32_uart_write(port, UART_INT_ENA_REG, 0); in esp32_uart_shutdown()
358 free_irq(port->irq, port); in esp32_uart_shutdown()
359 clk_disable_unprepare(sport->clk); in esp32_uart_shutdown()
362 static bool esp32_uart_set_baud(struct uart_port *port, u32 baud) in esp32_uart_set_baud() argument
364 u32 sclk = port->uartclk; in esp32_uart_set_baud()
367 if (port_variant(port)->has_clkconf) { in esp32_uart_set_baud()
368 u32 sclk_div = div / port_variant(port)->clkdiv_mask; in esp32_uart_set_baud()
370 if (div > port_variant(port)->clkdiv_mask) { in esp32_uart_set_baud()
374 esp32_uart_write(port, ESP32S3_UART_CLK_CONF_REG, in esp32_uart_set_baud()
379 if (div <= port_variant(port)->clkdiv_mask) { in esp32_uart_set_baud()
380 u32 frag = (sclk * 16) / baud - div * 16; in esp32_uart_set_baud()
382 esp32_uart_write(port, UART_CLKDIV_REG, in esp32_uart_set_baud()
390 static void esp32_uart_set_termios(struct uart_port *port, in esp32_uart_set_termios() argument
397 const u32 rx_flow_en = port_variant(port)->rx_flow_en; in esp32_uart_set_termios()
398 u32 max_div = port_variant(port)->clkdiv_mask; in esp32_uart_set_termios()
400 termios->c_cflag &= ~CMSPAR; in esp32_uart_set_termios()
402 if (port_variant(port)->has_clkconf) in esp32_uart_set_termios()
405 baud = uart_get_baud_rate(port, termios, old, in esp32_uart_set_termios()
406 port->uartclk / max_div, in esp32_uart_set_termios()
407 port->uartclk / 16); in esp32_uart_set_termios()
409 spin_lock_irqsave(&port->lock, flags); in esp32_uart_set_termios()
411 conf0 = esp32_uart_read(port, UART_CONF0_REG); in esp32_uart_set_termios()
414 conf1 = esp32_uart_read(port, UART_CONF1_REG); in esp32_uart_set_termios()
417 if (termios->c_cflag & PARENB) { in esp32_uart_set_termios()
419 if (termios->c_cflag & PARODD) in esp32_uart_set_termios()
423 switch (termios->c_cflag & CSIZE) { in esp32_uart_set_termios()
438 if (termios->c_cflag & CSTOPB) in esp32_uart_set_termios()
443 if (termios->c_cflag & CRTSCTS) in esp32_uart_set_termios()
446 esp32_uart_write(port, UART_CONF0_REG, conf0); in esp32_uart_set_termios()
447 esp32_uart_write(port, UART_CONF1_REG, conf1); in esp32_uart_set_termios()
450 esp32_uart_set_baud(port, baud); in esp32_uart_set_termios()
451 uart_update_timeout(port, termios->c_cflag, baud); in esp32_uart_set_termios()
453 if (esp32_uart_set_baud(port, 115200)) { in esp32_uart_set_termios()
456 uart_update_timeout(port, termios->c_cflag, baud); in esp32_uart_set_termios()
458 dev_warn(port->dev, in esp32_uart_set_termios()
463 spin_unlock_irqrestore(&port->lock, flags); in esp32_uart_set_termios()
466 static const char *esp32_uart_type(struct uart_port *port) in esp32_uart_type() argument
468 return port_variant(port)->type; in esp32_uart_type()
471 /* configure/auto-configure the port */
472 static void esp32_uart_config_port(struct uart_port *port, int flags) in esp32_uart_config_port() argument
475 port->type = PORT_GENERIC; in esp32_uart_config_port()
479 static int esp32_uart_poll_init(struct uart_port *port) in esp32_uart_poll_init() argument
481 struct esp32_port *sport = container_of(port, struct esp32_port, port); in esp32_uart_poll_init()
483 return clk_prepare_enable(sport->clk); in esp32_uart_poll_init()
486 static void esp32_uart_poll_put_char(struct uart_port *port, unsigned char c) in esp32_uart_poll_put_char() argument
488 esp32_uart_put_char_sync(port, c); in esp32_uart_poll_put_char()
491 static int esp32_uart_poll_get_char(struct uart_port *port) in esp32_uart_poll_get_char() argument
493 if (esp32_uart_rx_fifo_cnt(port)) in esp32_uart_poll_get_char()
494 return esp32_uart_read(port, UART_FIFO_REG); in esp32_uart_poll_get_char()
520 static void esp32_uart_console_putchar(struct uart_port *port, u8 c) in esp32_uart_console_putchar() argument
522 esp32_uart_put_char_sync(port, c); in esp32_uart_console_putchar()
525 static void esp32_uart_string_write(struct uart_port *port, const char *s, in esp32_uart_string_write() argument
528 uart_console_write(port, s, count, esp32_uart_console_putchar); in esp32_uart_string_write()
534 struct esp32_port *sport = esp32_uart_ports[co->index]; in esp32_uart_console_write()
535 struct uart_port *port = &sport->port; in esp32_uart_console_write() local
539 if (port->sysrq) in esp32_uart_console_write()
542 locked = spin_trylock_irqsave(&port->lock, flags); in esp32_uart_console_write()
544 spin_lock_irqsave(&port->lock, flags); in esp32_uart_console_write()
546 esp32_uart_string_write(port, s, count); in esp32_uart_console_write()
549 spin_unlock_irqrestore(&port->lock, flags); in esp32_uart_console_write()
563 * if so, search for the first available port that does have in esp32_uart_console_setup()
566 if (co->index == -1 || co->index >= ARRAY_SIZE(esp32_uart_ports)) in esp32_uart_console_setup()
567 co->index = 0; in esp32_uart_console_setup()
569 sport = esp32_uart_ports[co->index]; in esp32_uart_console_setup()
571 return -ENODEV; in esp32_uart_console_setup()
573 ret = clk_prepare_enable(sport->clk); in esp32_uart_console_setup()
580 return uart_set_options(&sport->port, co, baud, parity, bits, flow); in esp32_uart_console_setup()
585 struct esp32_port *sport = esp32_uart_ports[co->index]; in esp32_uart_console_exit()
587 clk_disable_unprepare(sport->clk); in esp32_uart_console_exit()
599 .index = -1,
603 static void esp32_uart_earlycon_putchar(struct uart_port *port, u8 c) in esp32_uart_earlycon_putchar() argument
605 esp32_uart_put_char_sync(port, c); in esp32_uart_earlycon_putchar()
611 struct earlycon_device *dev = con->data; in esp32_uart_earlycon_write()
613 uart_console_write(&dev->port, s, n, esp32_uart_earlycon_putchar); in esp32_uart_earlycon_write()
619 struct earlycon_device *dev = con->data; in esp32_uart_earlycon_read()
623 int c = esp32_uart_poll_get_char(&dev->port); in esp32_uart_earlycon_read()
636 if (!device->port.membase) in esp32xx_uart_early_console_setup()
637 return -ENODEV; in esp32xx_uart_early_console_setup()
639 device->con->write = esp32_uart_earlycon_write; in esp32xx_uart_early_console_setup()
641 device->con->read = esp32_uart_earlycon_read; in esp32xx_uart_early_console_setup()
643 if (device->port.uartclk != BASE_BAUD * 16) in esp32xx_uart_early_console_setup()
644 esp32_uart_set_baud(&device->port, device->baud); in esp32xx_uart_early_console_setup()
652 device->port.private_data = (void *)&esp32_variant; in esp32_uart_early_console_setup()
657 OF_EARLYCON_DECLARE(esp32uart, "esp,esp32-uart",
663 device->port.private_data = (void *)&esp32s3_variant; in esp32s3_uart_early_console_setup()
668 OF_EARLYCON_DECLARE(esp32s3uart, "esp,esp32s3-uart",
681 struct device_node *np = pdev->dev.of_node; in esp32_uart_probe()
682 struct uart_port *port; in esp32_uart_probe() local
687 sport = devm_kzalloc(&pdev->dev, sizeof(*sport), GFP_KERNEL); in esp32_uart_probe()
689 return -ENOMEM; in esp32_uart_probe()
691 port = &sport->port; in esp32_uart_probe()
695 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret); in esp32_uart_probe()
699 dev_err(&pdev->dev, "driver limited to %d serial ports\n", UART_NR); in esp32_uart_probe()
700 return -ENOMEM; in esp32_uart_probe()
703 port->line = ret; in esp32_uart_probe()
707 return -ENODEV; in esp32_uart_probe()
709 port->mapbase = res->start; in esp32_uart_probe()
710 port->membase = devm_ioremap_resource(&pdev->dev, res); in esp32_uart_probe()
711 if (IS_ERR(port->membase)) in esp32_uart_probe()
712 return PTR_ERR(port->membase); in esp32_uart_probe()
714 sport->clk = devm_clk_get(&pdev->dev, NULL); in esp32_uart_probe()
715 if (IS_ERR(sport->clk)) in esp32_uart_probe()
716 return PTR_ERR(sport->clk); in esp32_uart_probe()
718 port->uartclk = clk_get_rate(sport->clk); in esp32_uart_probe()
719 port->dev = &pdev->dev; in esp32_uart_probe()
720 port->type = PORT_GENERIC; in esp32_uart_probe()
721 port->iotype = UPIO_MEM; in esp32_uart_probe()
722 port->irq = platform_get_irq(pdev, 0); in esp32_uart_probe()
723 port->ops = &esp32_uart_pops; in esp32_uart_probe()
724 port->flags = UPF_BOOT_AUTOCONF; in esp32_uart_probe()
725 port->has_sysrq = 1; in esp32_uart_probe()
726 port->fifosize = ESP32_UART_TX_FIFO_SIZE; in esp32_uart_probe()
727 port->private_data = (void *)device_get_match_data(&pdev->dev); in esp32_uart_probe()
729 esp32_uart_ports[port->line] = sport; in esp32_uart_probe()
731 platform_set_drvdata(pdev, port); in esp32_uart_probe()
733 return uart_add_one_port(&esp32_uart_reg, port); in esp32_uart_probe()
738 struct uart_port *port = platform_get_drvdata(pdev); in esp32_uart_remove() local
740 uart_remove_one_port(&esp32_uart_reg, port); in esp32_uart_remove()