Lines Matching +full:lgm +full:- +full:io
1 // SPDX-License-Identifier: GPL-2.0
15 #include <linux/io.h>
150 spin_lock_irqsave(<q_port->lock, flags); in lqasc_start_tx()
152 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_start_tx()
159 __raw_writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE); in lqasc_stop_rx()
165 struct tty_port *tport = &port->state->port; in lqasc_rx_chars()
168 fifocnt = __raw_readl(port->membase + LTQ_ASC_FSTAT) & in lqasc_rx_chars()
170 while (fifocnt--) { in lqasc_rx_chars()
172 ch = readb(port->membase + LTQ_ASC_RBUF); in lqasc_rx_chars()
173 rsr = (__raw_readl(port->membase + LTQ_ASC_STATE) in lqasc_rx_chars()
176 port->icount.rx++; in lqasc_rx_chars()
184 port->icount.parity++; in lqasc_rx_chars()
186 port->membase + LTQ_ASC_WHBSTATE); in lqasc_rx_chars()
188 port->icount.frame++; in lqasc_rx_chars()
190 port->membase + LTQ_ASC_WHBSTATE); in lqasc_rx_chars()
193 port->icount.overrun++; in lqasc_rx_chars()
195 port->membase + LTQ_ASC_WHBSTATE); in lqasc_rx_chars()
198 rsr &= port->read_status_mask; in lqasc_rx_chars()
206 if ((rsr & port->ignore_status_mask) == 0) in lqasc_rx_chars()
227 struct circ_buf *xmit = &port->state->xmit; in lqasc_tx_chars()
233 while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) & in lqasc_tx_chars()
235 if (port->x_char) { in lqasc_tx_chars()
236 writeb(port->x_char, port->membase + LTQ_ASC_TBUF); in lqasc_tx_chars()
237 port->icount.tx++; in lqasc_tx_chars()
238 port->x_char = 0; in lqasc_tx_chars()
245 writeb(port->state->xmit.buf[port->state->xmit.tail], in lqasc_tx_chars()
246 port->membase + LTQ_ASC_TBUF); in lqasc_tx_chars()
247 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in lqasc_tx_chars()
248 port->icount.tx++; in lqasc_tx_chars()
262 spin_lock_irqsave(<q_port->lock, flags); in lqasc_tx_int()
263 __raw_writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR); in lqasc_tx_int()
264 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_tx_int()
276 spin_lock_irqsave(<q_port->lock, flags); in lqasc_err_int()
279 ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE); in lqasc_err_int()
280 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_err_int()
291 spin_lock_irqsave(<q_port->lock, flags); in lqasc_rx_int()
292 __raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); in lqasc_rx_int()
294 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_rx_int()
305 spin_lock_irqsave(<q_port->lock, flags); in lqasc_irq()
306 stat = readl(port->membase + LTQ_ASC_IRNCR); in lqasc_irq()
307 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_irq()
327 status = __raw_readl(port->membase + LTQ_ASC_FSTAT) & in lqasc_tx_empty()
355 if (!IS_ERR(ltq_port->clk)) in lqasc_startup()
356 clk_prepare_enable(ltq_port->clk); in lqasc_startup()
357 port->uartclk = clk_get_rate(ltq_port->freqclk); in lqasc_startup()
359 spin_lock_irqsave(<q_port->lock, flags); in lqasc_startup()
361 port->membase + LTQ_ASC_CLC); in lqasc_startup()
363 __raw_writel(0, port->membase + LTQ_ASC_PISEL); in lqasc_startup()
367 port->membase + LTQ_ASC_TXFCON); in lqasc_startup()
371 port->membase + LTQ_ASC_RXFCON); in lqasc_startup()
377 ASCCON_ROEN, port->membase + LTQ_ASC_CON); in lqasc_startup()
379 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_startup()
381 retval = ltq_port->soc->request_irq(port); in lqasc_startup()
386 port->membase + LTQ_ASC_IRNREN); in lqasc_startup()
396 ltq_port->soc->free_irq(port); in lqasc_shutdown()
398 spin_lock_irqsave(<q_port->lock, flags); in lqasc_shutdown()
399 __raw_writel(0, port->membase + LTQ_ASC_CON); in lqasc_shutdown()
401 port->membase + LTQ_ASC_RXFCON); in lqasc_shutdown()
403 port->membase + LTQ_ASC_TXFCON); in lqasc_shutdown()
404 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_shutdown()
405 if (!IS_ERR(ltq_port->clk)) in lqasc_shutdown()
406 clk_disable_unprepare(ltq_port->clk); in lqasc_shutdown()
421 cflag = new->c_cflag; in lqasc_set_termios()
422 iflag = new->c_iflag; in lqasc_set_termios()
432 new->c_cflag &= ~ CSIZE; in lqasc_set_termios()
433 new->c_cflag |= CS8; in lqasc_set_termios()
450 port->read_status_mask = ASCSTATE_ROE; in lqasc_set_termios()
452 port->read_status_mask |= ASCSTATE_FE | ASCSTATE_PE; in lqasc_set_termios()
454 port->ignore_status_mask = 0; in lqasc_set_termios()
456 port->ignore_status_mask |= ASCSTATE_FE | ASCSTATE_PE; in lqasc_set_termios()
464 port->ignore_status_mask |= ASCSTATE_ROE; in lqasc_set_termios()
468 port->ignore_status_mask |= UART_DUMMY_UER_RX; in lqasc_set_termios()
470 /* set error signals - framing, parity and overrun, enable receiver */ in lqasc_set_termios()
473 spin_lock_irqsave(<q_port->lock, flags); in lqasc_set_termios()
476 asc_update_bits(0, con, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
478 /* Set baud rate - take a divider of 2 into account */ in lqasc_set_termios()
479 baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16); in lqasc_set_termios()
481 divisor = divisor / 2 - 1; in lqasc_set_termios()
484 asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
487 asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
490 asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
493 __raw_writel(divisor, port->membase + LTQ_ASC_BG); in lqasc_set_termios()
496 asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
499 __raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); in lqasc_set_termios()
501 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_set_termios()
513 if (port->type == PORT_LTQ_ASC) in lqasc_type()
522 struct platform_device *pdev = to_platform_device(port->dev); in lqasc_release_port()
524 if (port->flags & UPF_IOREMAP) { in lqasc_release_port()
525 devm_iounmap(&pdev->dev, port->membase); in lqasc_release_port()
526 port->membase = NULL; in lqasc_release_port()
533 struct platform_device *pdev = to_platform_device(port->dev); in lqasc_request_port()
539 dev_err(&pdev->dev, "cannot obtain I/O memory region"); in lqasc_request_port()
540 return -ENODEV; in lqasc_request_port()
544 res = devm_request_mem_region(&pdev->dev, res->start, in lqasc_request_port()
545 size, dev_name(&pdev->dev)); in lqasc_request_port()
547 dev_err(&pdev->dev, "cannot request I/O memory region"); in lqasc_request_port()
548 return -EBUSY; in lqasc_request_port()
551 if (port->flags & UPF_IOREMAP) { in lqasc_request_port()
552 port->membase = devm_ioremap(&pdev->dev, in lqasc_request_port()
553 port->mapbase, size); in lqasc_request_port()
554 if (port->membase == NULL) in lqasc_request_port()
555 return -ENOMEM; in lqasc_request_port()
564 port->type = PORT_LTQ_ASC; in lqasc_config_port()
574 if (ser->type != PORT_UNKNOWN && ser->type != PORT_LTQ_ASC) in lqasc_verify_port()
575 ret = -EINVAL; in lqasc_verify_port()
576 if (ser->irq < 0 || ser->irq >= NR_IRQS) in lqasc_verify_port()
577 ret = -EINVAL; in lqasc_verify_port()
578 if (ser->baud_base < 9600) in lqasc_verify_port()
579 ret = -EINVAL; in lqasc_verify_port()
607 if (!port->membase) in lqasc_console_putchar()
611 fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT) in lqasc_console_putchar()
614 writeb(ch, port->membase + LTQ_ASC_TBUF); in lqasc_console_putchar()
629 if (co->index >= MAXPORTS) in lqasc_console_write()
632 ltq_port = lqasc_port[co->index]; in lqasc_console_write()
636 spin_lock_irqsave(<q_port->lock, flags); in lqasc_console_write()
637 lqasc_serial_port_write(<q_port->port, s, count); in lqasc_console_write()
638 spin_unlock_irqrestore(<q_port->lock, flags); in lqasc_console_write()
651 if (co->index >= MAXPORTS) in lqasc_console_setup()
652 return -ENODEV; in lqasc_console_setup()
654 ltq_port = lqasc_port[co->index]; in lqasc_console_setup()
656 return -ENODEV; in lqasc_console_setup()
658 port = <q_port->port; in lqasc_console_setup()
660 if (!IS_ERR(ltq_port->clk)) in lqasc_console_setup()
661 clk_prepare_enable(ltq_port->clk); in lqasc_console_setup()
663 port->uartclk = clk_get_rate(ltq_port->freqclk); in lqasc_console_setup()
676 .index = -1,
692 struct earlycon_device *dev = co->data; in lqasc_serial_early_console_write()
694 lqasc_serial_port_write(&dev->port, s, count); in lqasc_serial_early_console_write()
701 if (!device->port.membase) in lqasc_serial_early_console_setup()
702 return -ENODEV; in lqasc_serial_early_console_setup()
704 device->con->write = lqasc_serial_early_console_write; in lqasc_serial_early_console_setup()
708 OF_EARLYCON_DECLARE(lantiq, "intel,lgm-asc", lqasc_serial_early_console_setup);
730 struct uart_port *port = <q_port->port; in fetch_irq_lantiq()
734 ret = of_irq_to_resource_table(dev->of_node, irqres, 3); in fetch_irq_lantiq()
738 return -ENODEV; in fetch_irq_lantiq()
740 ltq_port->tx_irq = irqres[0].start; in fetch_irq_lantiq()
741 ltq_port->rx_irq = irqres[1].start; in fetch_irq_lantiq()
742 ltq_port->err_irq = irqres[2].start; in fetch_irq_lantiq()
743 port->irq = irqres[0].start; in fetch_irq_lantiq()
753 retval = request_irq(ltq_port->tx_irq, lqasc_tx_int, in request_irq_lantiq()
756 dev_err(port->dev, "failed to request asc_tx\n"); in request_irq_lantiq()
760 retval = request_irq(ltq_port->rx_irq, lqasc_rx_int, in request_irq_lantiq()
763 dev_err(port->dev, "failed to request asc_rx\n"); in request_irq_lantiq()
767 retval = request_irq(ltq_port->err_irq, lqasc_err_int, in request_irq_lantiq()
770 dev_err(port->dev, "failed to request asc_err\n"); in request_irq_lantiq()
776 free_irq(ltq_port->rx_irq, port); in request_irq_lantiq()
778 free_irq(ltq_port->tx_irq, port); in request_irq_lantiq()
786 free_irq(ltq_port->tx_irq, port); in free_irq_lantiq()
787 free_irq(ltq_port->rx_irq, port); in free_irq_lantiq()
788 free_irq(ltq_port->err_irq, port); in free_irq_lantiq()
793 struct uart_port *port = <q_port->port; in fetch_irq_intel()
796 ret = of_irq_get(dev->of_node, 0); in fetch_irq_intel()
801 ltq_port->common_irq = ret; in fetch_irq_intel()
802 port->irq = ret; in fetch_irq_intel()
812 retval = request_irq(ltq_port->common_irq, lqasc_irq, 0, in request_irq_intel()
815 dev_err(port->dev, "failed to request asc_irq\n"); in request_irq_intel()
824 free_irq(ltq_port->common_irq, port); in free_irq_intel()
829 struct device_node *node = pdev->dev.of_node; in lqasc_probe()
838 dev_err(&pdev->dev, in lqasc_probe()
840 return -ENODEV; in lqasc_probe()
843 ltq_port = devm_kzalloc(&pdev->dev, sizeof(struct ltq_uart_port), in lqasc_probe()
846 return -ENOMEM; in lqasc_probe()
848 port = <q_port->port; in lqasc_probe()
850 ltq_port->soc = of_device_get_match_data(&pdev->dev); in lqasc_probe()
851 ret = ltq_port->soc->fetch_irq(&pdev->dev, ltq_port); in lqasc_probe()
859 if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC)) in lqasc_probe()
864 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", in lqasc_probe()
871 dev_err(&pdev->dev, "port %d already allocated\n", line); in lqasc_probe()
872 return -EBUSY; in lqasc_probe()
875 port->iotype = SERIAL_IO_MEM; in lqasc_probe()
876 port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP; in lqasc_probe()
877 port->ops = &lqasc_pops; in lqasc_probe()
878 port->fifosize = 16; in lqasc_probe()
879 port->type = PORT_LTQ_ASC, in lqasc_probe()
880 port->line = line; in lqasc_probe()
881 port->dev = &pdev->dev; in lqasc_probe()
882 /* unused, just to be backward-compatible */ in lqasc_probe()
883 port->mapbase = mmres->start; in lqasc_probe()
886 ltq_port->freqclk = clk_get_fpi(); in lqasc_probe()
888 ltq_port->freqclk = devm_clk_get(&pdev->dev, "freq"); in lqasc_probe()
891 if (IS_ERR(ltq_port->freqclk)) { in lqasc_probe()
893 return -ENOENT; in lqasc_probe()
898 ltq_port->clk = clk_get(&pdev->dev, NULL); in lqasc_probe()
900 ltq_port->clk = devm_clk_get(&pdev->dev, "asc"); in lqasc_probe()
902 spin_lock_init(<q_port->lock); in lqasc_probe()
932 { .compatible = "intel,lgm-asc", .data = &soc_data_intel },