Lines Matching +full:uart +full:- +full:r1p8

1 // SPDX-License-Identifier: GPL-2.0+
3 * Cadence UART driver (found in Xilinx Zynq)
5 * 2011 - 2014 (C) 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
318 if (uart_circ_empty(&port->state->xmit)) { in cdns_uart_handle_tx()
319 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IDR); in cdns_uart_handle_tx()
321 numbytes = port->fifosize; in cdns_uart_handle_tx()
322 while (numbytes && !uart_circ_empty(&port->state->xmit) && in cdns_uart_handle_tx()
323 !(readl(port->membase + CDNS_UART_SR) & in cdns_uart_handle_tx()
326 * Get the data from the UART circular buffer in cdns_uart_handle_tx()
331 port->state->xmit.buf[port->state->xmit.tail], in cdns_uart_handle_tx()
332 port->membase + CDNS_UART_FIFO); in cdns_uart_handle_tx()
334 port->icount.tx++; in cdns_uart_handle_tx()
337 * Adjust the tail of the UART buffer and wrap in cdns_uart_handle_tx()
340 port->state->xmit.tail = in cdns_uart_handle_tx()
341 (port->state->xmit.tail + 1) & in cdns_uart_handle_tx()
342 (UART_XMIT_SIZE - 1); in cdns_uart_handle_tx()
344 numbytes--; in cdns_uart_handle_tx()
348 &port->state->xmit) < WAKEUP_CHARS) in cdns_uart_handle_tx()
354 * cdns_uart_isr - Interrupt handler
365 spin_lock(&port->lock); in cdns_uart_isr()
370 isrstatus = readl(port->membase + CDNS_UART_ISR); in cdns_uart_isr()
371 writel(isrstatus, port->membase + CDNS_UART_ISR); in cdns_uart_isr()
383 !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) in cdns_uart_isr()
386 spin_unlock(&port->lock); in cdns_uart_isr()
391 * cdns_uart_calc_baud_divs - Calculate baud rate divisors
392 * @clk: UART module input clock
402 * input_clk = (Uart User Defined Clock or Apb Clock)
434 bauderror = baud - calc_baud; in cdns_uart_calc_baud_divs()
436 bauderror = calc_baud - baud; in cdns_uart_calc_baud_divs()
453 * cdns_uart_set_baud_rate - Calculate and set the baud rate
454 * @port: Handle to the uart port structure
466 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_set_baud_rate()
468 calc_baud = cdns_uart_calc_baud_divs(port->uartclk, baud, &bdiv, &cd, in cdns_uart_set_baud_rate()
472 mreg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
477 writel(mreg, port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
478 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_uart_set_baud_rate()
479 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_uart_set_baud_rate()
480 cdns_uart->baud = baud; in cdns_uart_set_baud_rate()
487 * cdns_uart_clk_notifier_cb - Clock notifier callback
503 port = cdns_uart->port; in cdns_uart_clk_notifier_cb()
504 if (port->suspended) in cdns_uart_clk_notifier_cb()
514 * Find out if current baud-rate can be achieved with new clock in cdns_uart_clk_notifier_cb()
517 if (!cdns_uart_calc_baud_divs(ndata->new_rate, cdns_uart->baud, in cdns_uart_clk_notifier_cb()
519 dev_warn(port->dev, "clock rate change rejected\n"); in cdns_uart_clk_notifier_cb()
523 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
526 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
528 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
530 spin_unlock_irqrestore(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
540 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
543 port->uartclk = ndata->new_rate; in cdns_uart_clk_notifier_cb()
545 cdns_uart->baud = cdns_uart_set_baud_rate(cdns_uart->port, in cdns_uart_clk_notifier_cb()
546 cdns_uart->baud); in cdns_uart_clk_notifier_cb()
550 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
553 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
555 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
557 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_clk_notifier_cb()
566 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_clk_notifier_cb()
567 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
570 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
572 spin_unlock_irqrestore(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
582 * cdns_uart_start_tx - Start transmitting bytes
583 * @port: Handle to the uart port structure
596 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
599 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
601 if (uart_circ_empty(&port->state->xmit)) in cdns_uart_start_tx()
606 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); in cdns_uart_start_tx()
608 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER); in cdns_uart_start_tx()
612 * cdns_uart_stop_tx - Stop TX
613 * @port: Handle to the uart port structure
619 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
622 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
626 * cdns_uart_stop_rx - Stop RX
627 * @port: Handle to the uart port structure
634 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IDR); in cdns_uart_stop_rx()
637 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
639 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
643 * cdns_uart_tx_empty - Check whether TX is empty
644 * @port: Handle to the uart port structure
652 status = readl(port->membase + CDNS_UART_SR) & in cdns_uart_tx_empty()
658 * cdns_uart_break_ctl - Based on the input ctl we have to start or stop
660 * @port: Handle to the uart port structure
668 spin_lock_irqsave(&port->lock, flags); in cdns_uart_break_ctl()
670 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
672 if (ctl == -1) in cdns_uart_break_ctl()
674 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
678 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
680 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_break_ctl()
684 * cdns_uart_set_termios - termios operations, handling data length, parity,
686 * @port: Handle to the uart port structure
698 spin_lock_irqsave(&port->lock, flags); in cdns_uart_set_termios()
701 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
703 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
707 * min and max baud should be calculated here based on port->uartclk. in cdns_uart_set_termios()
710 minbaud = port->uartclk / in cdns_uart_set_termios()
712 maxbaud = port->uartclk / (CDNS_UART_BDIV_MIN + 1); in cdns_uart_set_termios()
718 /* Update the per-port timeout. */ in cdns_uart_set_termios()
719 uart_update_timeout(port, termios->c_cflag, baud); in cdns_uart_set_termios()
722 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
724 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
726 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_set_termios()
734 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
737 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
739 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_set_termios()
741 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
743 port->ignore_status_mask = 0; in cdns_uart_set_termios()
745 if (termios->c_iflag & INPCK) in cdns_uart_set_termios()
746 port->read_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
749 if (termios->c_iflag & IGNPAR) in cdns_uart_set_termios()
750 port->ignore_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
754 if ((termios->c_cflag & CREAD) == 0) in cdns_uart_set_termios()
755 port->ignore_status_mask |= CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
759 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
762 switch (termios->c_cflag & CSIZE) { in cdns_uart_set_termios()
772 termios->c_cflag &= ~CSIZE; in cdns_uart_set_termios()
773 termios->c_cflag |= CS8; in cdns_uart_set_termios()
778 if (termios->c_cflag & CSTOPB) in cdns_uart_set_termios()
783 if (termios->c_cflag & PARENB) { in cdns_uart_set_termios()
785 if (termios->c_cflag & CMSPAR) { in cdns_uart_set_termios()
786 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
791 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
800 writel(cval, port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
802 cval = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
803 if (termios->c_cflag & CRTSCTS) in cdns_uart_set_termios()
807 writel(cval, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
809 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_set_termios()
813 * cdns_uart_startup - Called when an application opens a cdns_uart port
814 * @port: Handle to the uart port structure
820 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_startup()
826 is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_startup()
828 spin_lock_irqsave(&port->lock, flags); in cdns_uart_startup()
832 port->membase + CDNS_UART_CR); in cdns_uart_startup()
838 port->membase + CDNS_UART_CR); in cdns_uart_startup()
840 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_startup()
848 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_startup()
851 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_startup()
858 port->membase + CDNS_UART_MR); in cdns_uart_startup()
864 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_startup()
870 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_startup()
873 writel(readl(port->membase + CDNS_UART_ISR), in cdns_uart_startup()
874 port->membase + CDNS_UART_ISR); in cdns_uart_startup()
876 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_startup()
878 ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port); in cdns_uart_startup()
880 dev_err(port->dev, "request_irq '%d' failed with %d\n", in cdns_uart_startup()
881 port->irq, ret); in cdns_uart_startup()
888 port->membase + CDNS_UART_IER); in cdns_uart_startup()
890 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); in cdns_uart_startup()
896 * cdns_uart_shutdown - Called when an application closes a cdns_uart port
897 * @port: Handle to the uart port structure
904 spin_lock_irqsave(&port->lock, flags); in cdns_uart_shutdown()
907 status = readl(port->membase + CDNS_UART_IMR); in cdns_uart_shutdown()
908 writel(status, port->membase + CDNS_UART_IDR); in cdns_uart_shutdown()
909 writel(0xffffffff, port->membase + CDNS_UART_ISR); in cdns_uart_shutdown()
913 port->membase + CDNS_UART_CR); in cdns_uart_shutdown()
915 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_shutdown()
917 free_irq(port->irq, port); in cdns_uart_shutdown()
921 * cdns_uart_type - Set UART type to cdns_uart port
922 * @port: Handle to the uart port structure
928 return port->type == PORT_XUARTPS ? CDNS_UART_NAME : NULL; in cdns_uart_type()
932 * cdns_uart_verify_port - Verify the port params
933 * @port: Handle to the uart port structure
941 if (ser->type != PORT_UNKNOWN && ser->type != PORT_XUARTPS) in cdns_uart_verify_port()
942 return -EINVAL; in cdns_uart_verify_port()
943 if (port->irq != ser->irq) in cdns_uart_verify_port()
944 return -EINVAL; in cdns_uart_verify_port()
945 if (ser->io_type != UPIO_MEM) in cdns_uart_verify_port()
946 return -EINVAL; in cdns_uart_verify_port()
947 if (port->iobase != ser->port) in cdns_uart_verify_port()
948 return -EINVAL; in cdns_uart_verify_port()
949 if (ser->hub6 != 0) in cdns_uart_verify_port()
950 return -EINVAL; in cdns_uart_verify_port()
955 * cdns_uart_request_port - Claim the memory region attached to cdns_uart port,
958 * @port: Handle to the uart port structure
964 if (!request_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE, in cdns_uart_request_port()
966 return -ENOMEM; in cdns_uart_request_port()
969 port->membase = ioremap(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
970 if (!port->membase) { in cdns_uart_request_port()
971 dev_err(port->dev, "Unable to map registers\n"); in cdns_uart_request_port()
972 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
973 return -ENOMEM; in cdns_uart_request_port()
979 * cdns_uart_release_port - Release UART port
980 * @port: Handle to the uart port structure
987 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_release_port()
988 iounmap(port->membase); in cdns_uart_release_port()
989 port->membase = NULL; in cdns_uart_release_port()
993 * cdns_uart_config_port - Configure UART port
994 * @port: Handle to the uart port structure
1000 port->type = PORT_XUARTPS; in cdns_uart_config_port()
1004 * cdns_uart_get_mctrl - Get the modem control state
1005 * @port: Handle to the uart port structure
1013 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_get_mctrl()
1015 if (cdns_uart_data->cts_override) in cdns_uart_get_mctrl()
1018 val = readl(port->membase + CDNS_UART_MODEMSR); in cdns_uart_get_mctrl()
1035 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_set_mctrl()
1037 if (cdns_uart_data->cts_override) in cdns_uart_set_mctrl()
1040 val = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1041 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1055 writel(val, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1056 writel(mode_reg, port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1065 spin_lock_irqsave(&port->lock, flags); in cdns_uart_poll_get_char()
1068 if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY) in cdns_uart_poll_get_char()
1071 c = (unsigned char) readl(port->membase + CDNS_UART_FIFO); in cdns_uart_poll_get_char()
1073 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_poll_get_char()
1082 spin_lock_irqsave(&port->lock, flags); in cdns_uart_poll_put_char()
1085 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1089 writel(c, port->membase + CDNS_UART_FIFO); in cdns_uart_poll_put_char()
1092 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1095 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_poll_put_char()
1104 pm_runtime_mark_last_busy(port->dev); in cdns_uart_pm()
1105 pm_runtime_put_autosuspend(port->dev); in cdns_uart_pm()
1108 pm_runtime_get_sync(port->dev); in cdns_uart_pm()
1140 * cdns_uart_console_putchar - write the character to the FIFO buffer
1141 * @port: Handle to the uart port structure
1146 while (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXFULL) in cdns_uart_console_putchar()
1148 writel(ch, port->membase + CDNS_UART_FIFO); in cdns_uart_console_putchar()
1154 struct earlycon_device *dev = con->data; in cdns_early_write()
1156 uart_console_write(&dev->port, s, n, cdns_uart_console_putchar); in cdns_early_write()
1162 struct uart_port *port = &device->port; in cdns_early_console_setup()
1164 if (!port->membase) in cdns_early_console_setup()
1165 return -ENODEV; in cdns_early_console_setup()
1169 port->membase + CDNS_UART_CR); in cdns_early_console_setup()
1171 /* only set baud if specified on command line - otherwise in cdns_early_console_setup()
1174 if (port->uartclk && device->baud) { in cdns_early_console_setup()
1179 cdns_uart_calc_baud_divs(port->uartclk, device->baud, in cdns_early_console_setup()
1185 writel(mr, port->membase + CDNS_UART_MR); in cdns_early_console_setup()
1186 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_early_console_setup()
1187 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_early_console_setup()
1190 device->con->write = cdns_early_write; in cdns_early_console_setup()
1195 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
1196 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
1197 OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
1204 * cdns_uart_console_write - perform write operation
1217 if (port->sysrq) in cdns_uart_console_write()
1220 locked = spin_trylock_irqsave(&port->lock, flags); in cdns_uart_console_write()
1222 spin_lock_irqsave(&port->lock, flags); in cdns_uart_console_write()
1225 imr = readl(port->membase + CDNS_UART_IMR); in cdns_uart_console_write()
1226 writel(imr, port->membase + CDNS_UART_IDR); in cdns_uart_console_write()
1232 ctrl = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1235 writel(ctrl, port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1242 writel(imr, port->membase + CDNS_UART_IER); in cdns_uart_console_write()
1245 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_console_write()
1249 * cdns_uart_console_setup - Initialize the uart to default config
1251 * @options: Initial settings of uart
1265 if (!port->membase) { in cdns_uart_console_setup()
1267 co->index); in cdns_uart_console_setup()
1268 return -ENODEV; in cdns_uart_console_setup()
1290 .index = -1, /* Specified on the cmdline (e.g. console=ttyPS ) */
1297 * cdns_uart_suspend - suspend event
1305 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_suspend()
1313 spin_lock_irqsave(&port->lock, flags); in cdns_uart_suspend()
1315 while (!(readl(port->membase + CDNS_UART_SR) & in cdns_uart_suspend()
1317 readl(port->membase + CDNS_UART_FIFO); in cdns_uart_suspend()
1319 writel(1, port->membase + CDNS_UART_RXWM); in cdns_uart_suspend()
1321 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR); in cdns_uart_suspend()
1322 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_suspend()
1329 return uart_suspend_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_suspend()
1333 * cdns_uart_resume - Resume after a previous suspend
1341 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_resume()
1349 clk_enable(cdns_uart->pclk); in cdns_uart_resume()
1350 clk_enable(cdns_uart->uartclk); in cdns_uart_resume()
1352 spin_lock_irqsave(&port->lock, flags); in cdns_uart_resume()
1355 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1357 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1358 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_resume()
1363 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_resume()
1365 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1368 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1370 clk_disable(cdns_uart->uartclk); in cdns_uart_resume()
1371 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1372 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_resume()
1374 spin_lock_irqsave(&port->lock, flags); in cdns_uart_resume()
1376 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_resume()
1378 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER); in cdns_uart_resume()
1379 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_resume()
1382 return uart_resume_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_resume()
1388 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_suspend()
1390 clk_disable(cdns_uart->uartclk); in cdns_runtime_suspend()
1391 clk_disable(cdns_uart->pclk); in cdns_runtime_suspend()
1398 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_resume()
1400 clk_enable(cdns_uart->pclk); in cdns_runtime_resume()
1401 clk_enable(cdns_uart->uartclk); in cdns_runtime_resume()
1417 { .compatible = "cdns,uart-r1p8", },
1418 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def },
1419 { .compatible = "xlnx,zynqmp-uart", .data = &zynqmp_uart_def },
1428 * cdns_uart_probe - Platform driver probe
1441 cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), in cdns_uart_probe()
1444 return -ENOMEM; in cdns_uart_probe()
1445 port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL); in cdns_uart_probe()
1447 return -ENOMEM; in cdns_uart_probe()
1450 id = of_alias_get_id(pdev->dev.of_node, "serial"); in cdns_uart_probe()
1455 dev_err(&pdev->dev, "Cannot get uart_port structure\n"); in cdns_uart_probe()
1456 return -ENODEV; in cdns_uart_probe()
1472 dev_err(&pdev->dev, "Failed to register driver\n"); in cdns_uart_probe()
1477 cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver; in cdns_uart_probe()
1479 match = of_match_node(cdns_uart_of_match, pdev->dev.of_node); in cdns_uart_probe()
1480 if (match && match->data) { in cdns_uart_probe()
1481 const struct cdns_platform_data *data = match->data; in cdns_uart_probe()
1483 cdns_uart_data->quirks = data->quirks; in cdns_uart_probe()
1486 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "pclk"); in cdns_uart_probe()
1487 if (PTR_ERR(cdns_uart_data->pclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1488 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1492 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1493 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "aper_clk"); in cdns_uart_probe()
1494 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1495 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1498 dev_err(&pdev->dev, "clock name 'aper_clk' is deprecated.\n"); in cdns_uart_probe()
1501 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "uart_clk"); in cdns_uart_probe()
1502 if (PTR_ERR(cdns_uart_data->uartclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1503 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1507 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1508 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "ref_clk"); in cdns_uart_probe()
1509 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1510 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1513 dev_err(&pdev->dev, "clock name 'ref_clk' is deprecated.\n"); in cdns_uart_probe()
1516 rc = clk_prepare_enable(cdns_uart_data->pclk); in cdns_uart_probe()
1518 dev_err(&pdev->dev, "Unable to enable pclk clock.\n"); in cdns_uart_probe()
1521 rc = clk_prepare_enable(cdns_uart_data->uartclk); in cdns_uart_probe()
1523 dev_err(&pdev->dev, "Unable to enable device clock.\n"); in cdns_uart_probe()
1529 rc = -ENODEV; in cdns_uart_probe()
1535 rc = -ENXIO; in cdns_uart_probe()
1540 cdns_uart_data->clk_rate_change_nb.notifier_call = in cdns_uart_probe()
1542 if (clk_notifier_register(cdns_uart_data->uartclk, in cdns_uart_probe()
1543 &cdns_uart_data->clk_rate_change_nb)) in cdns_uart_probe()
1544 dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); in cdns_uart_probe()
1548 spin_lock_init(&port->lock); in cdns_uart_probe()
1549 port->type = PORT_UNKNOWN; in cdns_uart_probe()
1550 port->iotype = UPIO_MEM32; in cdns_uart_probe()
1551 port->flags = UPF_BOOT_AUTOCONF; in cdns_uart_probe()
1552 port->ops = &cdns_uart_ops; in cdns_uart_probe()
1553 port->fifosize = CDNS_UART_FIFO_SIZE; in cdns_uart_probe()
1554 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_XILINX_PS_UART_CONSOLE); in cdns_uart_probe()
1555 port->line = id; in cdns_uart_probe()
1562 port->mapbase = res->start; in cdns_uart_probe()
1563 port->irq = irq; in cdns_uart_probe()
1564 port->dev = &pdev->dev; in cdns_uart_probe()
1565 port->uartclk = clk_get_rate(cdns_uart_data->uartclk); in cdns_uart_probe()
1566 port->private_data = cdns_uart_data; in cdns_uart_probe()
1567 cdns_uart_data->port = port; in cdns_uart_probe()
1570 pm_runtime_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1571 pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT); in cdns_uart_probe()
1572 pm_runtime_set_active(&pdev->dev); in cdns_uart_probe()
1573 pm_runtime_enable(&pdev->dev); in cdns_uart_probe()
1574 device_init_wakeup(port->dev, true); in cdns_uart_probe()
1591 dev_err(&pdev->dev, in cdns_uart_probe()
1599 !(cdns_uart_uart_driver.cons->flags & CON_ENABLED)) { in cdns_uart_probe()
1601 cdns_uart_console.index = -1; in cdns_uart_probe()
1605 cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node, in cdns_uart_probe()
1606 "cts-override"); in cdns_uart_probe()
1613 pm_runtime_disable(&pdev->dev); in cdns_uart_probe()
1614 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_probe()
1615 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1617 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_probe()
1618 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_probe()
1621 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_probe()
1623 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_probe()
1626 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_probe()
1631 * cdns_uart_remove - called when the platform driver is unregistered
1639 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_remove()
1644 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_remove()
1645 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_remove()
1647 rc = uart_remove_one_port(cdns_uart_data->cdns_uart_driver, port); in cdns_uart_remove()
1648 port->mapbase = 0; in cdns_uart_remove()
1649 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_remove()
1650 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_remove()
1651 pm_runtime_disable(&pdev->dev); in cdns_uart_remove()
1652 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_remove()
1653 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_remove()
1654 device_init_wakeup(&pdev->dev, false); in cdns_uart_remove()
1661 if (!--instances) in cdns_uart_remove()
1662 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_remove()
1692 MODULE_DESCRIPTION("Driver for Cadence UART");