Lines Matching +full:mps2 +full:- +full:uart

1 // SPDX-License-Identifier: GPL-2.0
3 * MPS2 UART driver
27 #define DRIVER_NAME "mps2-uart"
87 writeb(val, mps_port->port.membase + off); in mps2_uart_write8()
94 return readb(mps_port->port.membase + off); in mps2_uart_read8()
101 writel_relaxed(val, mps_port->port.membase + off); in mps2_uart_write32()
147 * We've just unmasked the TX IRQ and now slow-starting via in mps2_uart_start_tx()
150 * point we switch to fully interrupt-driven TX. in mps2_uart_start_tx()
171 struct tty_port *tport = &port->state->port; in mps2_uart_rx_chars()
176 port->icount.rx++; in mps2_uart_rx_chars()
177 tty_insert_flip_char(&port->state->port, rxdata, TTY_NORMAL); in mps2_uart_rx_chars()
228 struct tty_port *tport = &port->state->port; in mps2_uart_oerrirq()
231 port->icount.overrun++; in mps2_uart_oerrirq()
276 if (mps_port->flags & UART_PORT_COMBINED_IRQ) { in mps2_uart_startup()
277 ret = request_irq(port->irq, mps2_uart_combinedirq, 0, in mps2_uart_startup()
278 MAKE_NAME(-combined), mps_port); in mps2_uart_startup()
281 dev_err(port->dev, "failed to register combinedirq (%d)\n", ret); in mps2_uart_startup()
285 ret = request_irq(port->irq, mps2_uart_oerrirq, IRQF_SHARED, in mps2_uart_startup()
286 MAKE_NAME(-overrun), mps_port); in mps2_uart_startup()
289 dev_err(port->dev, "failed to register oerrirq (%d)\n", ret); in mps2_uart_startup()
293 ret = request_irq(mps_port->rx_irq, mps2_uart_rxirq, 0, in mps2_uart_startup()
294 MAKE_NAME(-rx), mps_port); in mps2_uart_startup()
296 dev_err(port->dev, "failed to register rxirq (%d)\n", ret); in mps2_uart_startup()
300 ret = request_irq(mps_port->tx_irq, mps2_uart_txirq, 0, in mps2_uart_startup()
301 MAKE_NAME(-tx), mps_port); in mps2_uart_startup()
303 dev_err(port->dev, "failed to register txirq (%d)\n", ret); in mps2_uart_startup()
316 free_irq(mps_port->rx_irq, mps_port); in mps2_uart_startup()
318 free_irq(port->irq, mps_port); in mps2_uart_startup()
332 if (!(mps_port->flags & UART_PORT_COMBINED_IRQ)) { in mps2_uart_shutdown()
333 free_irq(mps_port->rx_irq, mps_port); in mps2_uart_shutdown()
334 free_irq(mps_port->tx_irq, mps_port); in mps2_uart_shutdown()
337 free_irq(port->irq, mps_port); in mps2_uart_shutdown()
347 termios->c_cflag &= ~(CRTSCTS | CMSPAR); in mps2_uart_set_termios()
348 termios->c_cflag &= ~CSIZE; in mps2_uart_set_termios()
349 termios->c_cflag |= CS8; in mps2_uart_set_termios()
350 termios->c_cflag &= ~PARENB; in mps2_uart_set_termios()
351 termios->c_cflag &= ~CSTOPB; in mps2_uart_set_termios()
354 DIV_ROUND_CLOSEST(port->uartclk, UARTn_BAUDDIV_MASK), in mps2_uart_set_termios()
355 DIV_ROUND_CLOSEST(port->uartclk, 16)); in mps2_uart_set_termios()
357 bauddiv = DIV_ROUND_CLOSEST(port->uartclk, baud); in mps2_uart_set_termios()
361 uart_update_timeout(port, termios->c_cflag, baud); in mps2_uart_set_termios()
372 return (port->type == PORT_MPS2UART) ? DRIVER_NAME : NULL; in mps2_uart_type()
387 port->type = PORT_MPS2UART; in mps2_uart_config_port()
392 return -EINVAL; in mps2_uart_verify_port()
426 struct mps2_uart_port *mps_port = idr_find(&ports_idr, co->index); in mps2_uart_console_write()
427 struct uart_port *port = &mps_port->port; in mps2_uart_console_write()
440 if (co->index < 0 || co->index >= MPS2_MAX_PORTS) in mps2_uart_console_setup()
441 return -ENODEV; in mps2_uart_console_setup()
443 mps_port = idr_find(&ports_idr, co->index); in mps2_uart_console_setup()
446 return -ENODEV; in mps2_uart_console_setup()
451 return uart_set_options(&mps_port->port, co, baud, parity, bits, flow); in mps2_uart_console_setup()
462 .index = -1,
470 while (readb(port->membase + UARTn_STATE) & UARTn_STATE_TX_FULL) in mps2_early_putchar()
473 writeb((unsigned char)ch, port->membase + UARTn_DATA); in mps2_early_putchar()
478 struct earlycon_device *dev = con->data; in mps2_early_write()
480 uart_console_write(&dev->port, s, n, mps2_early_putchar); in mps2_early_write()
486 if (!device->port.membase) in mps2_early_console_setup()
487 return -ENODEV; in mps2_early_console_setup()
489 device->con->write = mps2_early_write; in mps2_early_console_setup()
494 OF_EARLYCON_DECLARE(mps2, "arm,mps2-uart", mps2_early_console_setup);
510 struct device_node *np = pdev->dev.of_node; in mps2_of_get_port()
514 return -ENODEV; in mps2_of_get_port()
528 mps_port->flags |= UART_PORT_COMBINED_IRQ; in mps2_of_get_port()
530 mps_port->port.line = id; in mps2_of_get_port()
541 mps_port->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in mps2_init_port()
542 if (IS_ERR(mps_port->port.membase)) in mps2_init_port()
543 return PTR_ERR(mps_port->port.membase); in mps2_init_port()
545 mps_port->port.mapbase = res->start; in mps2_init_port()
546 mps_port->port.mapsize = resource_size(res); in mps2_init_port()
547 mps_port->port.iotype = UPIO_MEM; in mps2_init_port()
548 mps_port->port.flags = UPF_BOOT_AUTOCONF; in mps2_init_port()
549 mps_port->port.fifosize = 1; in mps2_init_port()
550 mps_port->port.ops = &mps2_uart_pops; in mps2_init_port()
551 mps_port->port.dev = &pdev->dev; in mps2_init_port()
553 mps_port->clk = devm_clk_get(&pdev->dev, NULL); in mps2_init_port()
554 if (IS_ERR(mps_port->clk)) in mps2_init_port()
555 return PTR_ERR(mps_port->clk); in mps2_init_port()
557 ret = clk_prepare_enable(mps_port->clk); in mps2_init_port()
561 mps_port->port.uartclk = clk_get_rate(mps_port->clk); in mps2_init_port()
563 clk_disable_unprepare(mps_port->clk); in mps2_init_port()
566 if (mps_port->flags & UART_PORT_COMBINED_IRQ) { in mps2_init_port()
567 mps_port->port.irq = platform_get_irq(pdev, 0); in mps2_init_port()
569 mps_port->rx_irq = platform_get_irq(pdev, 0); in mps2_init_port()
570 mps_port->tx_irq = platform_get_irq(pdev, 1); in mps2_init_port()
571 mps_port->port.irq = platform_get_irq(pdev, 2); in mps2_init_port()
582 mps_port = devm_kzalloc(&pdev->dev, sizeof(struct mps2_uart_port), GFP_KERNEL); in mps2_serial_probe()
585 return -ENOMEM; in mps2_serial_probe()
595 ret = uart_add_one_port(&mps2_uart_driver, &mps_port->port); in mps2_serial_probe()
606 { .compatible = "arm,mps2-uart", },