• Home
  • Raw
  • Download

Lines Matching +full:lgm +full:- +full:io

1 // SPDX-License-Identifier: GPL-2.0
15 #include <linux/io.h>
150 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_start_tx()
152 spin_unlock_irqrestore(&ltq_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(&ltq_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(&ltq_port->lock, flags); in lqasc_tx_int()
276 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_err_int()
277 __raw_writel(ASC_IRNCR_EIR, port->membase + LTQ_ASC_IRNCR); in lqasc_err_int()
280 ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE); in lqasc_err_int()
281 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_err_int()
292 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_rx_int()
293 __raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); in lqasc_rx_int()
295 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_rx_int()
306 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_irq()
307 stat = readl(port->membase + LTQ_ASC_IRNCR); in lqasc_irq()
308 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_irq()
328 status = __raw_readl(port->membase + LTQ_ASC_FSTAT) & in lqasc_tx_empty()
356 if (!IS_ERR(ltq_port->clk)) in lqasc_startup()
357 clk_prepare_enable(ltq_port->clk); in lqasc_startup()
358 port->uartclk = clk_get_rate(ltq_port->freqclk); in lqasc_startup()
360 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_startup()
362 port->membase + LTQ_ASC_CLC); in lqasc_startup()
364 __raw_writel(0, port->membase + LTQ_ASC_PISEL); in lqasc_startup()
368 port->membase + LTQ_ASC_TXFCON); in lqasc_startup()
372 port->membase + LTQ_ASC_RXFCON); in lqasc_startup()
378 ASCCON_ROEN, port->membase + LTQ_ASC_CON); in lqasc_startup()
380 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_startup()
382 retval = ltq_port->soc->request_irq(port); in lqasc_startup()
387 port->membase + LTQ_ASC_IRNREN); in lqasc_startup()
397 ltq_port->soc->free_irq(port); in lqasc_shutdown()
399 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_shutdown()
400 __raw_writel(0, port->membase + LTQ_ASC_CON); in lqasc_shutdown()
402 port->membase + LTQ_ASC_RXFCON); in lqasc_shutdown()
404 port->membase + LTQ_ASC_TXFCON); in lqasc_shutdown()
405 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_shutdown()
406 if (!IS_ERR(ltq_port->clk)) in lqasc_shutdown()
407 clk_disable_unprepare(ltq_port->clk); in lqasc_shutdown()
422 cflag = new->c_cflag; in lqasc_set_termios()
423 iflag = new->c_iflag; in lqasc_set_termios()
433 new->c_cflag &= ~ CSIZE; in lqasc_set_termios()
434 new->c_cflag |= CS8; in lqasc_set_termios()
451 port->read_status_mask = ASCSTATE_ROE; in lqasc_set_termios()
453 port->read_status_mask |= ASCSTATE_FE | ASCSTATE_PE; in lqasc_set_termios()
455 port->ignore_status_mask = 0; in lqasc_set_termios()
457 port->ignore_status_mask |= ASCSTATE_FE | ASCSTATE_PE; in lqasc_set_termios()
465 port->ignore_status_mask |= ASCSTATE_ROE; in lqasc_set_termios()
469 port->ignore_status_mask |= UART_DUMMY_UER_RX; in lqasc_set_termios()
471 /* set error signals - framing, parity and overrun, enable receiver */ in lqasc_set_termios()
474 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_set_termios()
477 asc_update_bits(0, con, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
479 /* Set baud rate - take a divider of 2 into account */ in lqasc_set_termios()
480 baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16); in lqasc_set_termios()
482 divisor = divisor / 2 - 1; in lqasc_set_termios()
485 asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
488 asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
491 asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
494 __raw_writel(divisor, port->membase + LTQ_ASC_BG); in lqasc_set_termios()
497 asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON); in lqasc_set_termios()
500 __raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); in lqasc_set_termios()
502 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_set_termios()
514 if (port->type == PORT_LTQ_ASC) in lqasc_type()
523 struct platform_device *pdev = to_platform_device(port->dev); in lqasc_release_port()
525 if (port->flags & UPF_IOREMAP) { in lqasc_release_port()
526 devm_iounmap(&pdev->dev, port->membase); in lqasc_release_port()
527 port->membase = NULL; in lqasc_release_port()
534 struct platform_device *pdev = to_platform_device(port->dev); in lqasc_request_port()
540 dev_err(&pdev->dev, "cannot obtain I/O memory region"); in lqasc_request_port()
541 return -ENODEV; in lqasc_request_port()
545 res = devm_request_mem_region(&pdev->dev, res->start, in lqasc_request_port()
546 size, dev_name(&pdev->dev)); in lqasc_request_port()
548 dev_err(&pdev->dev, "cannot request I/O memory region"); in lqasc_request_port()
549 return -EBUSY; in lqasc_request_port()
552 if (port->flags & UPF_IOREMAP) { in lqasc_request_port()
553 port->membase = devm_ioremap(&pdev->dev, in lqasc_request_port()
554 port->mapbase, size); in lqasc_request_port()
555 if (port->membase == NULL) in lqasc_request_port()
556 return -ENOMEM; in lqasc_request_port()
565 port->type = PORT_LTQ_ASC; in lqasc_config_port()
575 if (ser->type != PORT_UNKNOWN && ser->type != PORT_LTQ_ASC) in lqasc_verify_port()
576 ret = -EINVAL; in lqasc_verify_port()
577 if (ser->irq < 0 || ser->irq >= NR_IRQS) in lqasc_verify_port()
578 ret = -EINVAL; in lqasc_verify_port()
579 if (ser->baud_base < 9600) in lqasc_verify_port()
580 ret = -EINVAL; in lqasc_verify_port()
608 if (!port->membase) in lqasc_console_putchar()
612 fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT) in lqasc_console_putchar()
615 writeb(ch, port->membase + LTQ_ASC_TBUF); in lqasc_console_putchar()
630 if (co->index >= MAXPORTS) in lqasc_console_write()
633 ltq_port = lqasc_port[co->index]; in lqasc_console_write()
637 spin_lock_irqsave(&ltq_port->lock, flags); in lqasc_console_write()
638 lqasc_serial_port_write(&ltq_port->port, s, count); in lqasc_console_write()
639 spin_unlock_irqrestore(&ltq_port->lock, flags); in lqasc_console_write()
652 if (co->index >= MAXPORTS) in lqasc_console_setup()
653 return -ENODEV; in lqasc_console_setup()
655 ltq_port = lqasc_port[co->index]; in lqasc_console_setup()
657 return -ENODEV; in lqasc_console_setup()
659 port = &ltq_port->port; in lqasc_console_setup()
661 if (!IS_ERR(ltq_port->clk)) in lqasc_console_setup()
662 clk_prepare_enable(ltq_port->clk); in lqasc_console_setup()
664 port->uartclk = clk_get_rate(ltq_port->freqclk); in lqasc_console_setup()
677 .index = -1,
693 struct earlycon_device *dev = co->data; in lqasc_serial_early_console_write()
695 lqasc_serial_port_write(&dev->port, s, count); in lqasc_serial_early_console_write()
702 if (!device->port.membase) in lqasc_serial_early_console_setup()
703 return -ENODEV; in lqasc_serial_early_console_setup()
705 device->con->write = lqasc_serial_early_console_write; in lqasc_serial_early_console_setup()
709 OF_EARLYCON_DECLARE(lantiq, "intel,lgm-asc", lqasc_serial_early_console_setup);
731 struct uart_port *port = &ltq_port->port; in fetch_irq_lantiq()
735 ret = of_irq_to_resource_table(dev->of_node, irqres, 3); in fetch_irq_lantiq()
739 return -ENODEV; in fetch_irq_lantiq()
741 ltq_port->tx_irq = irqres[0].start; in fetch_irq_lantiq()
742 ltq_port->rx_irq = irqres[1].start; in fetch_irq_lantiq()
743 ltq_port->err_irq = irqres[2].start; in fetch_irq_lantiq()
744 port->irq = irqres[0].start; in fetch_irq_lantiq()
754 retval = request_irq(ltq_port->tx_irq, lqasc_tx_int, in request_irq_lantiq()
757 dev_err(port->dev, "failed to request asc_tx\n"); in request_irq_lantiq()
761 retval = request_irq(ltq_port->rx_irq, lqasc_rx_int, in request_irq_lantiq()
764 dev_err(port->dev, "failed to request asc_rx\n"); in request_irq_lantiq()
768 retval = request_irq(ltq_port->err_irq, lqasc_err_int, in request_irq_lantiq()
771 dev_err(port->dev, "failed to request asc_err\n"); in request_irq_lantiq()
777 free_irq(ltq_port->rx_irq, port); in request_irq_lantiq()
779 free_irq(ltq_port->tx_irq, port); in request_irq_lantiq()
787 free_irq(ltq_port->tx_irq, port); in free_irq_lantiq()
788 free_irq(ltq_port->rx_irq, port); in free_irq_lantiq()
789 free_irq(ltq_port->err_irq, port); in free_irq_lantiq()
794 struct uart_port *port = &ltq_port->port; in fetch_irq_intel()
797 ret = of_irq_get(dev->of_node, 0); in fetch_irq_intel()
802 ltq_port->common_irq = ret; in fetch_irq_intel()
803 port->irq = ret; in fetch_irq_intel()
813 retval = request_irq(ltq_port->common_irq, lqasc_irq, 0, in request_irq_intel()
816 dev_err(port->dev, "failed to request asc_irq\n"); in request_irq_intel()
825 free_irq(ltq_port->common_irq, port); in free_irq_intel()
830 struct device_node *node = pdev->dev.of_node; in lqasc_probe()
839 dev_err(&pdev->dev, in lqasc_probe()
841 return -ENODEV; in lqasc_probe()
844 ltq_port = devm_kzalloc(&pdev->dev, sizeof(struct ltq_uart_port), in lqasc_probe()
847 return -ENOMEM; in lqasc_probe()
849 port = &ltq_port->port; in lqasc_probe()
851 ltq_port->soc = of_device_get_match_data(&pdev->dev); in lqasc_probe()
852 ret = ltq_port->soc->fetch_irq(&pdev->dev, ltq_port); in lqasc_probe()
860 if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC)) in lqasc_probe()
865 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", in lqasc_probe()
872 dev_err(&pdev->dev, "port %d already allocated\n", line); in lqasc_probe()
873 return -EBUSY; in lqasc_probe()
876 port->iotype = SERIAL_IO_MEM; in lqasc_probe()
877 port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP; in lqasc_probe()
878 port->ops = &lqasc_pops; in lqasc_probe()
879 port->fifosize = 16; in lqasc_probe()
880 port->type = PORT_LTQ_ASC, in lqasc_probe()
881 port->line = line; in lqasc_probe()
882 port->dev = &pdev->dev; in lqasc_probe()
883 /* unused, just to be backward-compatible */ in lqasc_probe()
884 port->mapbase = mmres->start; in lqasc_probe()
887 ltq_port->freqclk = clk_get_fpi(); in lqasc_probe()
889 ltq_port->freqclk = devm_clk_get(&pdev->dev, "freq"); in lqasc_probe()
892 if (IS_ERR(ltq_port->freqclk)) { in lqasc_probe()
894 return -ENOENT; in lqasc_probe()
899 ltq_port->clk = clk_get(&pdev->dev, NULL); in lqasc_probe()
901 ltq_port->clk = devm_clk_get(&pdev->dev, "asc"); in lqasc_probe()
903 spin_lock_init(&ltq_port->lock); in lqasc_probe()
933 { .compatible = "intel,lgm-asc", .data = &soc_data_intel },