Lines Matching +full:uart +full:- +full:r1p8
1 // SPDX-License-Identifier: GPL-2.0+
3 * Cadence UART driver (found in Xilinx Zynq)
5 * Copyright (c) 2011 - 2014 Xilinx, Inc.
7 * This driver has originally been pushed by Xilinx using a Zynq-branding. This
39 MODULE_PARM_DESC(rx_trigger_level, "Rx trigger level, 1-63 bytes");
44 MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255");
46 /* Register offsets for the UART. */
87 #define CDNS_UART_MR_CLKSEL 0x00000001 /* Pre-scalar selection */
187 * struct cdns_uart - device data
188 * @port: Pointer to the UART port
191 * @cdns_uart_driver: Pointer to UART driver
214 * cdns_uart_handle_rx - Handle the received bytes along with Rx errors.
215 * @dev_id: Id of the UART port
222 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_handle_rx()
230 is_rxbs_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_handle_rx()
232 while ((readl(port->membase + CDNS_UART_SR) & in cdns_uart_handle_rx()
235 rxbs_status = readl(port->membase + CDNS_UART_RXBS); in cdns_uart_handle_rx()
236 data = readl(port->membase + CDNS_UART_FIFO); in cdns_uart_handle_rx()
237 port->icount.rx++; in cdns_uart_handle_rx()
240 * framing error with all-zeros data as a break sequence. in cdns_uart_handle_rx()
241 * Most of the time, there's another non-zero byte at the in cdns_uart_handle_rx()
246 port->read_status_mask |= CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
252 port->icount.brk++; in cdns_uart_handle_rx()
258 isrstatus &= port->read_status_mask; in cdns_uart_handle_rx()
259 isrstatus &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
260 status_mask = port->read_status_mask; in cdns_uart_handle_rx()
261 status_mask &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
264 (port->read_status_mask & CDNS_UART_IXR_BRK)) { in cdns_uart_handle_rx()
265 port->read_status_mask &= ~CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
266 port->icount.brk++; in cdns_uart_handle_rx()
277 port->icount.parity++; in cdns_uart_handle_rx()
282 port->icount.frame++; in cdns_uart_handle_rx()
287 port->icount.parity++; in cdns_uart_handle_rx()
292 port->icount.frame++; in cdns_uart_handle_rx()
297 port->icount.overrun++; in cdns_uart_handle_rx()
298 tty_insert_flip_char(&port->state->port, 0, in cdns_uart_handle_rx()
301 tty_insert_flip_char(&port->state->port, data, status); in cdns_uart_handle_rx()
305 tty_flip_buffer_push(&port->state->port); in cdns_uart_handle_rx()
309 * cdns_uart_handle_tx - Handle the bytes to be Txed.
310 * @dev_id: Id of the UART port
316 struct circ_buf *xmit = &port->state->xmit; in cdns_uart_handle_tx()
320 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IDR); in cdns_uart_handle_tx()
324 numbytes = port->fifosize; in cdns_uart_handle_tx()
326 !(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXFULL)) { in cdns_uart_handle_tx()
328 writel(xmit->buf[xmit->tail], port->membase + CDNS_UART_FIFO); in cdns_uart_handle_tx()
330 numbytes--; in cdns_uart_handle_tx()
338 * cdns_uart_isr - Interrupt handler
354 isrstatus = readl(port->membase + CDNS_UART_ISR); in cdns_uart_isr()
355 writel(isrstatus, port->membase + CDNS_UART_ISR); in cdns_uart_isr()
362 isrstatus &= port->read_status_mask; in cdns_uart_isr()
363 isrstatus &= ~port->ignore_status_mask; in cdns_uart_isr()
369 !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) in cdns_uart_isr()
377 * cdns_uart_calc_baud_divs - Calculate baud rate divisors
378 * @clk: UART module input clock
388 * input_clk = (Uart User Defined Clock or Apb Clock)
420 bauderror = baud - calc_baud; in cdns_uart_calc_baud_divs()
422 bauderror = calc_baud - baud; in cdns_uart_calc_baud_divs()
439 * cdns_uart_set_baud_rate - Calculate and set the baud rate
440 * @port: Handle to the uart port structure
452 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_set_baud_rate()
454 calc_baud = cdns_uart_calc_baud_divs(port->uartclk, baud, &bdiv, &cd, in cdns_uart_set_baud_rate()
458 mreg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
463 writel(mreg, port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
464 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_uart_set_baud_rate()
465 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_uart_set_baud_rate()
466 cdns_uart->baud = baud; in cdns_uart_set_baud_rate()
473 * cdns_uart_clk_notifier_cb - Clock notifier callback
489 port = cdns_uart->port; in cdns_uart_clk_notifier_cb()
490 if (port->suspended) in cdns_uart_clk_notifier_cb()
500 * Find out if current baud-rate can be achieved with new clock in cdns_uart_clk_notifier_cb()
503 if (!cdns_uart_calc_baud_divs(ndata->new_rate, cdns_uart->baud, in cdns_uart_clk_notifier_cb()
505 dev_warn(port->dev, "clock rate change rejected\n"); in cdns_uart_clk_notifier_cb()
509 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
512 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
514 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
516 uart_port_unlock_irqrestore(cdns_uart->port, flags); in cdns_uart_clk_notifier_cb()
526 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
529 port->uartclk = ndata->new_rate; in cdns_uart_clk_notifier_cb()
531 cdns_uart->baud = cdns_uart_set_baud_rate(cdns_uart->port, in cdns_uart_clk_notifier_cb()
532 cdns_uart->baud); in cdns_uart_clk_notifier_cb()
536 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
539 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
541 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
543 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_clk_notifier_cb()
552 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_clk_notifier_cb()
553 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
556 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
558 uart_port_unlock_irqrestore(cdns_uart->port, flags); in cdns_uart_clk_notifier_cb()
568 * cdns_uart_start_tx - Start transmitting bytes
569 * @port: Handle to the uart port structure
582 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
585 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
587 if (uart_circ_empty(&port->state->xmit)) in cdns_uart_start_tx()
590 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); in cdns_uart_start_tx()
595 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER); in cdns_uart_start_tx()
599 * cdns_uart_stop_tx - Stop TX
600 * @port: Handle to the uart port structure
606 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
609 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
613 * cdns_uart_stop_rx - Stop RX
614 * @port: Handle to the uart port structure
621 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IDR); in cdns_uart_stop_rx()
624 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
626 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
630 * cdns_uart_tx_empty - Check whether TX is empty
631 * @port: Handle to the uart port structure
639 status = readl(port->membase + CDNS_UART_SR) & in cdns_uart_tx_empty()
645 * cdns_uart_break_ctl - Based on the input ctl we have to start or stop
647 * @port: Handle to the uart port structure
657 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
659 if (ctl == -1) in cdns_uart_break_ctl()
661 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
665 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
671 * cdns_uart_set_termios - termios operations, handling data length, parity,
673 * @port: Handle to the uart port structure
689 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
691 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
695 * min and max baud should be calculated here based on port->uartclk. in cdns_uart_set_termios()
698 minbaud = port->uartclk / in cdns_uart_set_termios()
700 maxbaud = port->uartclk / (CDNS_UART_BDIV_MIN + 1); in cdns_uart_set_termios()
706 /* Update the per-port timeout. */ in cdns_uart_set_termios()
707 uart_update_timeout(port, termios->c_cflag, baud); in cdns_uart_set_termios()
710 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
712 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
714 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_set_termios()
722 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
725 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
727 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_set_termios()
729 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
731 port->ignore_status_mask = 0; in cdns_uart_set_termios()
733 if (termios->c_iflag & INPCK) in cdns_uart_set_termios()
734 port->read_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
737 if (termios->c_iflag & IGNPAR) in cdns_uart_set_termios()
738 port->ignore_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
742 if ((termios->c_cflag & CREAD) == 0) in cdns_uart_set_termios()
743 port->ignore_status_mask |= CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
747 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
750 switch (termios->c_cflag & CSIZE) { in cdns_uart_set_termios()
760 termios->c_cflag &= ~CSIZE; in cdns_uart_set_termios()
761 termios->c_cflag |= CS8; in cdns_uart_set_termios()
766 if (termios->c_cflag & CSTOPB) in cdns_uart_set_termios()
771 if (termios->c_cflag & PARENB) { in cdns_uart_set_termios()
773 if (termios->c_cflag & CMSPAR) { in cdns_uart_set_termios()
774 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
779 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
788 writel(cval, port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
790 cval = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
791 if (termios->c_cflag & CRTSCTS) in cdns_uart_set_termios()
795 writel(cval, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
801 * cdns_uart_startup - Called when an application opens a cdns_uart port
802 * @port: Handle to the uart port structure
808 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_startup()
814 is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_startup()
820 port->membase + CDNS_UART_CR); in cdns_uart_startup()
826 port->membase + CDNS_UART_CR); in cdns_uart_startup()
828 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_startup()
836 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_startup()
839 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_startup()
846 port->membase + CDNS_UART_MR); in cdns_uart_startup()
852 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_startup()
858 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_startup()
861 writel(readl(port->membase + CDNS_UART_ISR), in cdns_uart_startup()
862 port->membase + CDNS_UART_ISR); in cdns_uart_startup()
866 ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port); in cdns_uart_startup()
868 dev_err(port->dev, "request_irq '%d' failed with %d\n", in cdns_uart_startup()
869 port->irq, ret); in cdns_uart_startup()
876 port->membase + CDNS_UART_IER); in cdns_uart_startup()
878 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); in cdns_uart_startup()
884 * cdns_uart_shutdown - Called when an application closes a cdns_uart port
885 * @port: Handle to the uart port structure
895 status = readl(port->membase + CDNS_UART_IMR); in cdns_uart_shutdown()
896 writel(status, port->membase + CDNS_UART_IDR); in cdns_uart_shutdown()
897 writel(0xffffffff, port->membase + CDNS_UART_ISR); in cdns_uart_shutdown()
901 port->membase + CDNS_UART_CR); in cdns_uart_shutdown()
905 free_irq(port->irq, port); in cdns_uart_shutdown()
909 * cdns_uart_type - Set UART type to cdns_uart port
910 * @port: Handle to the uart port structure
916 return port->type == PORT_XUARTPS ? CDNS_UART_NAME : NULL; in cdns_uart_type()
920 * cdns_uart_verify_port - Verify the port params
921 * @port: Handle to the uart port structure
929 if (ser->type != PORT_UNKNOWN && ser->type != PORT_XUARTPS) in cdns_uart_verify_port()
930 return -EINVAL; in cdns_uart_verify_port()
931 if (port->irq != ser->irq) in cdns_uart_verify_port()
932 return -EINVAL; in cdns_uart_verify_port()
933 if (ser->io_type != UPIO_MEM) in cdns_uart_verify_port()
934 return -EINVAL; in cdns_uart_verify_port()
935 if (port->iobase != ser->port) in cdns_uart_verify_port()
936 return -EINVAL; in cdns_uart_verify_port()
937 if (ser->hub6 != 0) in cdns_uart_verify_port()
938 return -EINVAL; in cdns_uart_verify_port()
943 * cdns_uart_request_port - Claim the memory region attached to cdns_uart port,
946 * @port: Handle to the uart port structure
952 if (!request_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE, in cdns_uart_request_port()
954 return -ENOMEM; in cdns_uart_request_port()
957 port->membase = ioremap(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
958 if (!port->membase) { in cdns_uart_request_port()
959 dev_err(port->dev, "Unable to map registers\n"); in cdns_uart_request_port()
960 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
961 return -ENOMEM; in cdns_uart_request_port()
967 * cdns_uart_release_port - Release UART port
968 * @port: Handle to the uart port structure
975 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_release_port()
976 iounmap(port->membase); in cdns_uart_release_port()
977 port->membase = NULL; in cdns_uart_release_port()
981 * cdns_uart_config_port - Configure UART port
982 * @port: Handle to the uart port structure
988 port->type = PORT_XUARTPS; in cdns_uart_config_port()
992 * cdns_uart_get_mctrl - Get the modem control state
993 * @port: Handle to the uart port structure
1001 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_get_mctrl()
1003 if (cdns_uart_data->cts_override) in cdns_uart_get_mctrl()
1006 val = readl(port->membase + CDNS_UART_MODEMSR); in cdns_uart_get_mctrl()
1023 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_set_mctrl()
1025 if (cdns_uart_data->cts_override) in cdns_uart_set_mctrl()
1028 val = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1029 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1043 writel(val, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1044 writel(mode_reg, port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1056 if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY) in cdns_uart_poll_get_char()
1059 c = (unsigned char) readl(port->membase + CDNS_UART_FIFO); in cdns_uart_poll_get_char()
1073 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1077 writel(c, port->membase + CDNS_UART_FIFO); in cdns_uart_poll_put_char()
1080 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1092 pm_runtime_mark_last_busy(port->dev); in cdns_uart_pm()
1093 pm_runtime_put_autosuspend(port->dev); in cdns_uart_pm()
1096 pm_runtime_get_sync(port->dev); in cdns_uart_pm()
1128 * cdns_uart_console_putchar - write the character to the FIFO buffer
1129 * @port: Handle to the uart port structure
1139 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_putchar()
1143 dev_warn(port->dev, in cdns_uart_console_putchar()
1152 ctrl_reg = readl(port->membase + CDNS_UART_SR); in cdns_uart_console_putchar()
1157 dev_warn(port->dev, in cdns_uart_console_putchar()
1163 writel(ch, port->membase + CDNS_UART_FIFO); in cdns_uart_console_putchar()
1169 struct earlycon_device *dev = con->data; in cdns_early_write()
1171 uart_console_write(&dev->port, s, n, cdns_uart_console_putchar); in cdns_early_write()
1177 struct uart_port *port = &device->port; in cdns_early_console_setup()
1179 if (!port->membase) in cdns_early_console_setup()
1180 return -ENODEV; in cdns_early_console_setup()
1184 port->membase + CDNS_UART_CR); in cdns_early_console_setup()
1186 /* only set baud if specified on command line - otherwise in cdns_early_console_setup()
1189 if (port->uartclk && device->baud) { in cdns_early_console_setup()
1194 cdns_uart_calc_baud_divs(port->uartclk, device->baud, in cdns_early_console_setup()
1200 writel(mr, port->membase + CDNS_UART_MR); in cdns_early_console_setup()
1201 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_early_console_setup()
1202 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_early_console_setup()
1205 device->con->write = cdns_early_write; in cdns_early_console_setup()
1210 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
1211 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
1212 OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
1219 * cdns_uart_console_write - perform write operation
1232 if (port->sysrq) in cdns_uart_console_write()
1240 imr = readl(port->membase + CDNS_UART_IMR); in cdns_uart_console_write()
1241 writel(imr, port->membase + CDNS_UART_IDR); in cdns_uart_console_write()
1247 ctrl = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1250 writel(ctrl, port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1257 writel(imr, port->membase + CDNS_UART_IER); in cdns_uart_console_write()
1264 * cdns_uart_console_setup - Initialize the uart to default config
1266 * @options: Initial settings of uart
1280 if (!port->membase) { in cdns_uart_console_setup()
1282 co->index); in cdns_uart_console_setup()
1283 return -ENODEV; in cdns_uart_console_setup()
1305 .index = -1, /* Specified on the cmdline (e.g. console=ttyPS ) */
1312 * cdns_uart_suspend - suspend event
1320 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_suspend()
1330 while (!(readl(port->membase + CDNS_UART_SR) & in cdns_uart_suspend()
1332 readl(port->membase + CDNS_UART_FIFO); in cdns_uart_suspend()
1334 writel(1, port->membase + CDNS_UART_RXWM); in cdns_uart_suspend()
1336 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR); in cdns_uart_suspend()
1344 return uart_suspend_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_suspend()
1348 * cdns_uart_resume - Resume after a previous suspend
1356 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_resume()
1365 ret = clk_enable(cdns_uart->pclk); in cdns_uart_resume()
1369 ret = clk_enable(cdns_uart->uartclk); in cdns_uart_resume()
1371 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1378 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1380 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1381 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_resume()
1386 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_resume()
1388 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1391 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1393 clk_disable(cdns_uart->uartclk); in cdns_uart_resume()
1394 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1399 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_resume()
1401 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER); in cdns_uart_resume()
1405 return uart_resume_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_resume()
1411 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_suspend()
1413 clk_disable(cdns_uart->uartclk); in cdns_runtime_suspend()
1414 clk_disable(cdns_uart->pclk); in cdns_runtime_suspend()
1421 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_resume()
1424 ret = clk_enable(cdns_uart->pclk); in cdns_runtime_resume()
1428 ret = clk_enable(cdns_uart->uartclk); in cdns_runtime_resume()
1430 clk_disable(cdns_uart->pclk); in cdns_runtime_resume()
1448 { .compatible = "cdns,uart-r1p8", },
1449 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def },
1450 { .compatible = "xlnx,zynqmp-uart", .data = &zynqmp_uart_def },
1459 * cdns_uart_probe - Platform driver probe
1472 cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), in cdns_uart_probe()
1475 return -ENOMEM; in cdns_uart_probe()
1476 port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL); in cdns_uart_probe()
1478 return -ENOMEM; in cdns_uart_probe()
1481 id = of_alias_get_id(pdev->dev.of_node, "serial"); in cdns_uart_probe()
1486 dev_err(&pdev->dev, "Cannot get uart_port structure\n"); in cdns_uart_probe()
1487 return -ENODEV; in cdns_uart_probe()
1503 dev_err(&pdev->dev, "Failed to register driver\n"); in cdns_uart_probe()
1508 cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver; in cdns_uart_probe()
1510 match = of_match_node(cdns_uart_of_match, pdev->dev.of_node); in cdns_uart_probe()
1511 if (match && match->data) { in cdns_uart_probe()
1512 const struct cdns_platform_data *data = match->data; in cdns_uart_probe()
1514 cdns_uart_data->quirks = data->quirks; in cdns_uart_probe()
1517 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "pclk"); in cdns_uart_probe()
1518 if (PTR_ERR(cdns_uart_data->pclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1519 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1523 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1524 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "aper_clk"); in cdns_uart_probe()
1525 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1526 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1529 dev_err(&pdev->dev, "clock name 'aper_clk' is deprecated.\n"); in cdns_uart_probe()
1532 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "uart_clk"); in cdns_uart_probe()
1533 if (PTR_ERR(cdns_uart_data->uartclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1534 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1538 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1539 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "ref_clk"); in cdns_uart_probe()
1540 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1541 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1544 dev_err(&pdev->dev, "clock name 'ref_clk' is deprecated.\n"); in cdns_uart_probe()
1547 rc = clk_prepare_enable(cdns_uart_data->pclk); in cdns_uart_probe()
1549 dev_err(&pdev->dev, "Unable to enable pclk clock.\n"); in cdns_uart_probe()
1552 rc = clk_prepare_enable(cdns_uart_data->uartclk); in cdns_uart_probe()
1554 dev_err(&pdev->dev, "Unable to enable device clock.\n"); in cdns_uart_probe()
1560 rc = -ENODEV; in cdns_uart_probe()
1571 cdns_uart_data->clk_rate_change_nb.notifier_call = in cdns_uart_probe()
1573 if (clk_notifier_register(cdns_uart_data->uartclk, in cdns_uart_probe()
1574 &cdns_uart_data->clk_rate_change_nb)) in cdns_uart_probe()
1575 dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); in cdns_uart_probe()
1579 spin_lock_init(&port->lock); in cdns_uart_probe()
1580 port->type = PORT_UNKNOWN; in cdns_uart_probe()
1581 port->iotype = UPIO_MEM32; in cdns_uart_probe()
1582 port->flags = UPF_BOOT_AUTOCONF; in cdns_uart_probe()
1583 port->ops = &cdns_uart_ops; in cdns_uart_probe()
1584 port->fifosize = CDNS_UART_FIFO_SIZE; in cdns_uart_probe()
1585 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_XILINX_PS_UART_CONSOLE); in cdns_uart_probe()
1586 port->line = id; in cdns_uart_probe()
1593 port->mapbase = res->start; in cdns_uart_probe()
1594 port->irq = irq; in cdns_uart_probe()
1595 port->dev = &pdev->dev; in cdns_uart_probe()
1596 port->uartclk = clk_get_rate(cdns_uart_data->uartclk); in cdns_uart_probe()
1597 port->private_data = cdns_uart_data; in cdns_uart_probe()
1598 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_probe()
1600 cdns_uart_data->port = port; in cdns_uart_probe()
1603 pm_runtime_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1604 pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT); in cdns_uart_probe()
1605 pm_runtime_set_active(&pdev->dev); in cdns_uart_probe()
1606 pm_runtime_enable(&pdev->dev); in cdns_uart_probe()
1607 device_init_wakeup(port->dev, true); in cdns_uart_probe()
1624 dev_err(&pdev->dev, in cdns_uart_probe()
1634 cdns_uart_console.index = -1; in cdns_uart_probe()
1638 cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node, in cdns_uart_probe()
1639 "cts-override"); in cdns_uart_probe()
1646 pm_runtime_disable(&pdev->dev); in cdns_uart_probe()
1647 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_probe()
1648 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1650 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_probe()
1651 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_probe()
1654 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_probe()
1656 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_probe()
1659 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_probe()
1664 * cdns_uart_remove - called when the platform driver is unregistered
1670 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_remove()
1674 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_remove()
1675 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_remove()
1677 uart_remove_one_port(cdns_uart_data->cdns_uart_driver, port); in cdns_uart_remove()
1678 port->mapbase = 0; in cdns_uart_remove()
1679 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_remove()
1680 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_remove()
1681 pm_runtime_disable(&pdev->dev); in cdns_uart_remove()
1682 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_remove()
1683 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_remove()
1684 device_init_wakeup(&pdev->dev, false); in cdns_uart_remove()
1691 if (!--instances) in cdns_uart_remove()
1692 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_remove()
1721 MODULE_DESCRIPTION("Driver for Cadence UART");