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
213 * cdns_uart_handle_rx - Handle the received bytes along with Rx errors.
214 * @dev_id: Id of the UART port
221 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_handle_rx()
229 is_rxbs_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_handle_rx()
231 while ((readl(port->membase + CDNS_UART_SR) & in cdns_uart_handle_rx()
234 rxbs_status = readl(port->membase + CDNS_UART_RXBS); in cdns_uart_handle_rx()
235 data = readl(port->membase + CDNS_UART_FIFO); in cdns_uart_handle_rx()
236 port->icount.rx++; in cdns_uart_handle_rx()
239 * framing error with all-zeros data as a break sequence. in cdns_uart_handle_rx()
240 * Most of the time, there's another non-zero byte at the in cdns_uart_handle_rx()
245 port->read_status_mask |= CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
251 port->icount.brk++; in cdns_uart_handle_rx()
257 isrstatus &= port->read_status_mask; in cdns_uart_handle_rx()
258 isrstatus &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
259 status_mask = port->read_status_mask; in cdns_uart_handle_rx()
260 status_mask &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
263 (port->read_status_mask & CDNS_UART_IXR_BRK)) { in cdns_uart_handle_rx()
264 port->read_status_mask &= ~CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
265 port->icount.brk++; in cdns_uart_handle_rx()
276 port->icount.parity++; in cdns_uart_handle_rx()
281 port->icount.frame++; in cdns_uart_handle_rx()
286 port->icount.parity++; in cdns_uart_handle_rx()
291 port->icount.frame++; in cdns_uart_handle_rx()
296 port->icount.overrun++; in cdns_uart_handle_rx()
297 tty_insert_flip_char(&port->state->port, 0, in cdns_uart_handle_rx()
300 tty_insert_flip_char(&port->state->port, data, status); in cdns_uart_handle_rx()
303 spin_unlock(&port->lock); in cdns_uart_handle_rx()
304 tty_flip_buffer_push(&port->state->port); in cdns_uart_handle_rx()
305 spin_lock(&port->lock); 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()
378 isrstatus &= port->read_status_mask; in cdns_uart_isr()
379 isrstatus &= ~port->ignore_status_mask; in cdns_uart_isr()
385 !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) in cdns_uart_isr()
388 spin_unlock(&port->lock); in cdns_uart_isr()
393 * cdns_uart_calc_baud_divs - Calculate baud rate divisors
394 * @clk: UART module input clock
404 * input_clk = (Uart User Defined Clock or Apb Clock)
436 bauderror = baud - calc_baud; in cdns_uart_calc_baud_divs()
438 bauderror = calc_baud - baud; in cdns_uart_calc_baud_divs()
455 * cdns_uart_set_baud_rate - Calculate and set the baud rate
456 * @port: Handle to the uart port structure
468 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_set_baud_rate()
470 calc_baud = cdns_uart_calc_baud_divs(port->uartclk, baud, &bdiv, &cd, in cdns_uart_set_baud_rate()
474 mreg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
479 writel(mreg, port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
480 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_uart_set_baud_rate()
481 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_uart_set_baud_rate()
482 cdns_uart->baud = baud; in cdns_uart_set_baud_rate()
489 * cdns_uart_clk_notitifer_cb - Clock notifier callback
505 port = cdns_uart->port; in cdns_uart_clk_notifier_cb()
506 if (port->suspended) in cdns_uart_clk_notifier_cb()
516 * Find out if current baud-rate can be achieved with new clock in cdns_uart_clk_notifier_cb()
519 if (!cdns_uart_calc_baud_divs(ndata->new_rate, cdns_uart->baud, in cdns_uart_clk_notifier_cb()
521 dev_warn(port->dev, "clock rate change rejected\n"); in cdns_uart_clk_notifier_cb()
525 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
528 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
530 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
532 spin_unlock_irqrestore(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
542 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
545 port->uartclk = ndata->new_rate; in cdns_uart_clk_notifier_cb()
547 cdns_uart->baud = cdns_uart_set_baud_rate(cdns_uart->port, in cdns_uart_clk_notifier_cb()
548 cdns_uart->baud); in cdns_uart_clk_notifier_cb()
552 spin_lock_irqsave(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
555 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
557 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
559 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_clk_notifier_cb()
568 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_clk_notifier_cb()
569 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
572 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
574 spin_unlock_irqrestore(&cdns_uart->port->lock, flags); in cdns_uart_clk_notifier_cb()
584 * cdns_uart_start_tx - Start transmitting bytes
585 * @port: Handle to the uart port structure
598 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
601 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
603 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()
611 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER); in cdns_uart_start_tx()
615 * cdns_uart_stop_tx - Stop TX
616 * @port: Handle to the uart port structure
622 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
625 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
629 * cdns_uart_stop_rx - Stop RX
630 * @port: Handle to the uart port structure
637 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IDR); in cdns_uart_stop_rx()
640 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
642 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
646 * cdns_uart_tx_empty - Check whether TX is empty
647 * @port: Handle to the uart port structure
655 status = readl(port->membase + CDNS_UART_SR) & in cdns_uart_tx_empty()
661 * cdns_uart_break_ctl - Based on the input ctl we have to start or stop
663 * @port: Handle to the uart port structure
671 spin_lock_irqsave(&port->lock, flags); in cdns_uart_break_ctl()
673 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
675 if (ctl == -1) in cdns_uart_break_ctl()
677 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
681 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
683 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_break_ctl()
687 * cdns_uart_set_termios - termios operations, handling data length, parity,
689 * @port: Handle to the uart port structure
701 spin_lock_irqsave(&port->lock, flags); in cdns_uart_set_termios()
704 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
706 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
710 * min and max baud should be calculated here based on port->uartclk. in cdns_uart_set_termios()
713 minbaud = port->uartclk / in cdns_uart_set_termios()
715 maxbaud = port->uartclk / (CDNS_UART_BDIV_MIN + 1); in cdns_uart_set_termios()
721 /* Update the per-port timeout. */ in cdns_uart_set_termios()
722 uart_update_timeout(port, termios->c_cflag, baud); in cdns_uart_set_termios()
725 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
727 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
729 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_set_termios()
737 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
740 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
742 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_set_termios()
744 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
746 port->ignore_status_mask = 0; in cdns_uart_set_termios()
748 if (termios->c_iflag & INPCK) in cdns_uart_set_termios()
749 port->read_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
752 if (termios->c_iflag & IGNPAR) in cdns_uart_set_termios()
753 port->ignore_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
757 if ((termios->c_cflag & CREAD) == 0) in cdns_uart_set_termios()
758 port->ignore_status_mask |= CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
762 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
765 switch (termios->c_cflag & CSIZE) { in cdns_uart_set_termios()
775 termios->c_cflag &= ~CSIZE; in cdns_uart_set_termios()
776 termios->c_cflag |= CS8; in cdns_uart_set_termios()
781 if (termios->c_cflag & CSTOPB) in cdns_uart_set_termios()
786 if (termios->c_cflag & PARENB) { in cdns_uart_set_termios()
788 if (termios->c_cflag & CMSPAR) { in cdns_uart_set_termios()
789 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
794 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
803 writel(cval, port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
805 cval = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
806 if (termios->c_cflag & CRTSCTS) in cdns_uart_set_termios()
810 writel(cval, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
812 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_set_termios()
816 * cdns_uart_startup - Called when an application opens a cdns_uart port
817 * @port: Handle to the uart port structure
823 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_startup()
829 is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_startup()
831 spin_lock_irqsave(&port->lock, flags); in cdns_uart_startup()
835 port->membase + CDNS_UART_CR); in cdns_uart_startup()
841 port->membase + CDNS_UART_CR); in cdns_uart_startup()
843 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_startup()
851 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_startup()
854 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_startup()
861 port->membase + CDNS_UART_MR); in cdns_uart_startup()
867 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_startup()
873 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_startup()
876 writel(readl(port->membase + CDNS_UART_ISR), in cdns_uart_startup()
877 port->membase + CDNS_UART_ISR); in cdns_uart_startup()
879 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_startup()
881 ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port); in cdns_uart_startup()
883 dev_err(port->dev, "request_irq '%d' failed with %d\n", in cdns_uart_startup()
884 port->irq, ret); in cdns_uart_startup()
891 port->membase + CDNS_UART_IER); in cdns_uart_startup()
893 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); in cdns_uart_startup()
899 * cdns_uart_shutdown - Called when an application closes a cdns_uart port
900 * @port: Handle to the uart port structure
907 spin_lock_irqsave(&port->lock, flags); in cdns_uart_shutdown()
910 status = readl(port->membase + CDNS_UART_IMR); in cdns_uart_shutdown()
911 writel(status, port->membase + CDNS_UART_IDR); in cdns_uart_shutdown()
912 writel(0xffffffff, port->membase + CDNS_UART_ISR); in cdns_uart_shutdown()
916 port->membase + CDNS_UART_CR); in cdns_uart_shutdown()
918 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_shutdown()
920 free_irq(port->irq, port); in cdns_uart_shutdown()
924 * cdns_uart_type - Set UART type to cdns_uart port
925 * @port: Handle to the uart port structure
931 return port->type == PORT_XUARTPS ? CDNS_UART_NAME : NULL; in cdns_uart_type()
935 * cdns_uart_verify_port - Verify the port params
936 * @port: Handle to the uart port structure
944 if (ser->type != PORT_UNKNOWN && ser->type != PORT_XUARTPS) in cdns_uart_verify_port()
945 return -EINVAL; in cdns_uart_verify_port()
946 if (port->irq != ser->irq) in cdns_uart_verify_port()
947 return -EINVAL; in cdns_uart_verify_port()
948 if (ser->io_type != UPIO_MEM) in cdns_uart_verify_port()
949 return -EINVAL; in cdns_uart_verify_port()
950 if (port->iobase != ser->port) in cdns_uart_verify_port()
951 return -EINVAL; in cdns_uart_verify_port()
952 if (ser->hub6 != 0) in cdns_uart_verify_port()
953 return -EINVAL; in cdns_uart_verify_port()
958 * cdns_uart_request_port - Claim the memory region attached to cdns_uart port,
961 * @port: Handle to the uart port structure
967 if (!request_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE, in cdns_uart_request_port()
969 return -ENOMEM; in cdns_uart_request_port()
972 port->membase = ioremap(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
973 if (!port->membase) { in cdns_uart_request_port()
974 dev_err(port->dev, "Unable to map registers\n"); in cdns_uart_request_port()
975 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_request_port()
976 return -ENOMEM; in cdns_uart_request_port()
982 * cdns_uart_release_port - Release UART port
983 * @port: Handle to the uart port structure
990 release_mem_region(port->mapbase, CDNS_UART_REGISTER_SPACE); in cdns_uart_release_port()
991 iounmap(port->membase); in cdns_uart_release_port()
992 port->membase = NULL; in cdns_uart_release_port()
996 * cdns_uart_config_port - Configure UART port
997 * @port: Handle to the uart port structure
1003 port->type = PORT_XUARTPS; in cdns_uart_config_port()
1007 * cdns_uart_get_mctrl - Get the modem control state
1008 * @port: Handle to the uart port structure
1016 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_get_mctrl()
1018 if (cdns_uart_data->cts_override) in cdns_uart_get_mctrl()
1021 val = readl(port->membase + CDNS_UART_MODEMSR); in cdns_uart_get_mctrl()
1038 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_set_mctrl()
1040 if (cdns_uart_data->cts_override) in cdns_uart_set_mctrl()
1043 val = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1044 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1058 writel(val, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1059 writel(mode_reg, port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1068 spin_lock_irqsave(&port->lock, flags); in cdns_uart_poll_get_char()
1071 if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY) in cdns_uart_poll_get_char()
1074 c = (unsigned char) readl(port->membase + CDNS_UART_FIFO); in cdns_uart_poll_get_char()
1076 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_poll_get_char()
1085 spin_lock_irqsave(&port->lock, flags); in cdns_uart_poll_put_char()
1088 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1092 writel(c, port->membase + CDNS_UART_FIFO); in cdns_uart_poll_put_char()
1095 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1098 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_poll_put_char()
1107 pm_runtime_mark_last_busy(port->dev); in cdns_uart_pm()
1108 pm_runtime_put_autosuspend(port->dev); in cdns_uart_pm()
1111 pm_runtime_get_sync(port->dev); in cdns_uart_pm()
1143 * cdns_uart_console_putchar - write the character to the FIFO buffer
1144 * @port: Handle to the uart port structure
1149 while (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXFULL) in cdns_uart_console_putchar()
1151 writel(ch, port->membase + CDNS_UART_FIFO); in cdns_uart_console_putchar()
1157 struct earlycon_device *dev = con->data; in cdns_early_write()
1159 uart_console_write(&dev->port, s, n, cdns_uart_console_putchar); in cdns_early_write()
1165 struct uart_port *port = &device->port; in cdns_early_console_setup()
1167 if (!port->membase) in cdns_early_console_setup()
1168 return -ENODEV; in cdns_early_console_setup()
1172 port->membase + CDNS_UART_CR); in cdns_early_console_setup()
1174 /* only set baud if specified on command line - otherwise in cdns_early_console_setup()
1177 if (port->uartclk && device->baud) { in cdns_early_console_setup()
1182 cdns_uart_calc_baud_divs(port->uartclk, device->baud, in cdns_early_console_setup()
1188 writel(mr, port->membase + CDNS_UART_MR); in cdns_early_console_setup()
1189 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_early_console_setup()
1190 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_early_console_setup()
1193 device->con->write = cdns_early_write; in cdns_early_console_setup()
1198 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
1199 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
1200 OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
1207 * cdns_uart_console_write - perform write operation
1220 if (port->sysrq) in cdns_uart_console_write()
1223 locked = spin_trylock_irqsave(&port->lock, flags); in cdns_uart_console_write()
1225 spin_lock_irqsave(&port->lock, flags); in cdns_uart_console_write()
1228 imr = readl(port->membase + CDNS_UART_IMR); in cdns_uart_console_write()
1229 writel(imr, port->membase + CDNS_UART_IDR); in cdns_uart_console_write()
1235 ctrl = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1238 writel(ctrl, port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1245 writel(imr, port->membase + CDNS_UART_IER); in cdns_uart_console_write()
1248 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_console_write()
1252 * cdns_uart_console_setup - Initialize the uart to default config
1254 * @options: Initial settings of uart
1268 if (!port->membase) { in cdns_uart_console_setup()
1270 co->index); in cdns_uart_console_setup()
1271 return -ENODEV; in cdns_uart_console_setup()
1293 .index = -1, /* Specified on the cmdline (e.g. console=ttyPS ) */
1300 * cdns_uart_suspend - suspend event
1308 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_suspend()
1316 spin_lock_irqsave(&port->lock, flags); in cdns_uart_suspend()
1318 while (!(readl(port->membase + CDNS_UART_SR) & in cdns_uart_suspend()
1320 readl(port->membase + CDNS_UART_FIFO); in cdns_uart_suspend()
1322 writel(1, port->membase + CDNS_UART_RXWM); in cdns_uart_suspend()
1324 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR); in cdns_uart_suspend()
1325 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_suspend()
1332 return uart_suspend_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_suspend()
1336 * cdns_uart_resume - Resume after a previous suspend
1344 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_resume()
1352 clk_enable(cdns_uart->pclk); in cdns_uart_resume()
1353 clk_enable(cdns_uart->uartclk); in cdns_uart_resume()
1355 spin_lock_irqsave(&port->lock, flags); in cdns_uart_resume()
1358 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1360 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1361 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_resume()
1366 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_resume()
1368 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1371 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1373 clk_disable(cdns_uart->uartclk); in cdns_uart_resume()
1374 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1375 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_resume()
1377 spin_lock_irqsave(&port->lock, flags); in cdns_uart_resume()
1379 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_resume()
1381 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER); in cdns_uart_resume()
1382 spin_unlock_irqrestore(&port->lock, flags); in cdns_uart_resume()
1385 return uart_resume_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_resume()
1391 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_suspend()
1393 clk_disable(cdns_uart->uartclk); in cdns_runtime_suspend()
1394 clk_disable(cdns_uart->pclk); in cdns_runtime_suspend()
1401 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_resume()
1403 clk_enable(cdns_uart->pclk); in cdns_runtime_resume()
1404 clk_enable(cdns_uart->uartclk); in cdns_runtime_resume()
1420 { .compatible = "cdns,uart-r1p8", },
1421 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def },
1422 { .compatible = "xlnx,zynqmp-uart", .data = &zynqmp_uart_def },
1431 * cdns_uart_probe - Platform driver probe
1444 cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), in cdns_uart_probe()
1447 return -ENOMEM; in cdns_uart_probe()
1448 port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL); in cdns_uart_probe()
1450 return -ENOMEM; in cdns_uart_probe()
1453 id = of_alias_get_id(pdev->dev.of_node, "serial"); in cdns_uart_probe()
1458 dev_err(&pdev->dev, "Cannot get uart_port structure\n"); in cdns_uart_probe()
1459 return -ENODEV; in cdns_uart_probe()
1475 dev_err(&pdev->dev, "Failed to register driver\n"); in cdns_uart_probe()
1480 cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver; in cdns_uart_probe()
1482 match = of_match_node(cdns_uart_of_match, pdev->dev.of_node); in cdns_uart_probe()
1483 if (match && match->data) { in cdns_uart_probe()
1484 const struct cdns_platform_data *data = match->data; in cdns_uart_probe()
1486 cdns_uart_data->quirks = data->quirks; in cdns_uart_probe()
1489 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "pclk"); in cdns_uart_probe()
1490 if (PTR_ERR(cdns_uart_data->pclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1491 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1495 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1496 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "aper_clk"); in cdns_uart_probe()
1497 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1498 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1501 dev_err(&pdev->dev, "clock name 'aper_clk' is deprecated.\n"); in cdns_uart_probe()
1504 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "uart_clk"); in cdns_uart_probe()
1505 if (PTR_ERR(cdns_uart_data->uartclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1506 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1510 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1511 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "ref_clk"); in cdns_uart_probe()
1512 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1513 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1516 dev_err(&pdev->dev, "clock name 'ref_clk' is deprecated.\n"); in cdns_uart_probe()
1519 rc = clk_prepare_enable(cdns_uart_data->pclk); in cdns_uart_probe()
1521 dev_err(&pdev->dev, "Unable to enable pclk clock.\n"); in cdns_uart_probe()
1524 rc = clk_prepare_enable(cdns_uart_data->uartclk); in cdns_uart_probe()
1526 dev_err(&pdev->dev, "Unable to enable device clock.\n"); in cdns_uart_probe()
1532 rc = -ENODEV; in cdns_uart_probe()
1538 rc = -ENXIO; in cdns_uart_probe()
1543 cdns_uart_data->clk_rate_change_nb.notifier_call = in cdns_uart_probe()
1545 if (clk_notifier_register(cdns_uart_data->uartclk, in cdns_uart_probe()
1546 &cdns_uart_data->clk_rate_change_nb)) in cdns_uart_probe()
1547 dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); in cdns_uart_probe()
1551 spin_lock_init(&port->lock); in cdns_uart_probe()
1552 port->type = PORT_UNKNOWN; in cdns_uart_probe()
1553 port->iotype = UPIO_MEM32; in cdns_uart_probe()
1554 port->flags = UPF_BOOT_AUTOCONF; in cdns_uart_probe()
1555 port->ops = &cdns_uart_ops; in cdns_uart_probe()
1556 port->fifosize = CDNS_UART_FIFO_SIZE; in cdns_uart_probe()
1557 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_XILINX_PS_UART_CONSOLE); in cdns_uart_probe()
1558 port->line = id; in cdns_uart_probe()
1565 port->mapbase = res->start; in cdns_uart_probe()
1566 port->irq = irq; in cdns_uart_probe()
1567 port->dev = &pdev->dev; in cdns_uart_probe()
1568 port->uartclk = clk_get_rate(cdns_uart_data->uartclk); in cdns_uart_probe()
1569 port->private_data = cdns_uart_data; in cdns_uart_probe()
1570 cdns_uart_data->port = port; in cdns_uart_probe()
1573 pm_runtime_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1574 pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT); in cdns_uart_probe()
1575 pm_runtime_set_active(&pdev->dev); in cdns_uart_probe()
1576 pm_runtime_enable(&pdev->dev); in cdns_uart_probe()
1577 device_init_wakeup(port->dev, true); in cdns_uart_probe()
1594 dev_err(&pdev->dev, in cdns_uart_probe()
1602 !(cdns_uart_uart_driver.cons->flags & CON_ENABLED)) { in cdns_uart_probe()
1604 cdns_uart_console.index = -1; in cdns_uart_probe()
1608 cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node, in cdns_uart_probe()
1609 "cts-override"); in cdns_uart_probe()
1616 pm_runtime_disable(&pdev->dev); in cdns_uart_probe()
1617 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_probe()
1618 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1620 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_probe()
1621 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_probe()
1624 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_probe()
1626 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_probe()
1629 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_probe()
1634 * cdns_uart_remove - called when the platform driver is unregistered
1642 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_remove()
1647 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_remove()
1648 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_remove()
1650 rc = uart_remove_one_port(cdns_uart_data->cdns_uart_driver, port); in cdns_uart_remove()
1651 port->mapbase = 0; in cdns_uart_remove()
1652 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_remove()
1653 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_remove()
1654 pm_runtime_disable(&pdev->dev); in cdns_uart_remove()
1655 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_remove()
1656 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_remove()
1657 device_init_wakeup(&pdev->dev, false); in cdns_uart_remove()
1664 if (!--instances) in cdns_uart_remove()
1665 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_remove()
1695 MODULE_DESCRIPTION("Driver for Cadence UART");