Lines Matching +full:zynqmp +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2011 - 2014 Xilinx, Inc.
7 * This driver has originally been pushed by Xilinx using a Zynq-branding. This
28 #include <linux/reset.h>
41 MODULE_PARM_DESC(rx_trigger_level, "Rx trigger level, 1-63 bytes");
46 MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255");
76 #define CDNS_UART_CR_TXRST 0x00000002 /* TX logic reset */
77 #define CDNS_UART_CR_RXRST 0x00000001 /* RX logic reset */
89 #define CDNS_UART_MR_CLKSEL 0x00000001 /* Pre-scalar selection */
189 * struct cdns_uart - device data
201 * @rstc: Pointer to the reset control
232 * cdns_uart_handle_rx - Handle the received bytes along with Rx errors.
240 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_handle_rx()
248 is_rxbs_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_handle_rx()
250 while ((readl(port->membase + CDNS_UART_SR) & in cdns_uart_handle_rx()
253 rxbs_status = readl(port->membase + CDNS_UART_RXBS); in cdns_uart_handle_rx()
254 data = readl(port->membase + CDNS_UART_FIFO); in cdns_uart_handle_rx()
255 port->icount.rx++; in cdns_uart_handle_rx()
258 * framing error with all-zeros data as a break sequence. in cdns_uart_handle_rx()
259 * Most of the time, there's another non-zero byte at the in cdns_uart_handle_rx()
264 port->read_status_mask |= CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
270 port->icount.brk++; in cdns_uart_handle_rx()
276 isrstatus &= port->read_status_mask; in cdns_uart_handle_rx()
277 isrstatus &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
278 status_mask = port->read_status_mask; in cdns_uart_handle_rx()
279 status_mask &= ~port->ignore_status_mask; in cdns_uart_handle_rx()
282 (port->read_status_mask & CDNS_UART_IXR_BRK)) { in cdns_uart_handle_rx()
283 port->read_status_mask &= ~CDNS_UART_IXR_BRK; in cdns_uart_handle_rx()
284 port->icount.brk++; in cdns_uart_handle_rx()
295 port->icount.parity++; in cdns_uart_handle_rx()
300 port->icount.frame++; in cdns_uart_handle_rx()
305 port->icount.parity++; in cdns_uart_handle_rx()
310 port->icount.frame++; in cdns_uart_handle_rx()
315 port->icount.overrun++; in cdns_uart_handle_rx()
316 tty_insert_flip_char(&port->state->port, 0, in cdns_uart_handle_rx()
319 tty_insert_flip_char(&port->state->port, data, status); in cdns_uart_handle_rx()
323 tty_flip_buffer_push(&port->state->port); in cdns_uart_handle_rx()
327 * cdns_rts_gpio_enable - Configure RTS/GPIO to high/low
335 if (cdns_uart->gpiod_rts) { in cdns_rts_gpio_enable()
336 gpiod_set_value(cdns_uart->gpiod_rts, enable); in cdns_rts_gpio_enable()
338 val = readl(cdns_uart->port->membase + CDNS_UART_MODEMCR); in cdns_rts_gpio_enable()
343 writel(val, cdns_uart->port->membase + CDNS_UART_MODEMCR); in cdns_rts_gpio_enable()
348 * cdns_rs485_tx_setup - Tx setup specific to rs485
355 enable = cdns_uart->port->rs485.flags & SER_RS485_RTS_ON_SEND; in cdns_rs485_tx_setup()
358 cdns_uart->rs485_tx_started = true; in cdns_rs485_tx_setup()
362 * cdns_rs485_rx_setup - Rx setup specific to rs485
369 enable = cdns_uart->port->rs485.flags & SER_RS485_RTS_AFTER_SEND; in cdns_rs485_rx_setup()
372 cdns_uart->rs485_tx_started = false; in cdns_rs485_rx_setup()
376 * cdns_uart_tx_empty - Check whether TX is empty
385 status = readl(port->membase + CDNS_UART_SR); in cdns_uart_tx_empty()
391 * cdns_rs485_rx_callback - Timer rx callback handler for rs485.
408 * cdns_calc_after_tx_delay - calculate delay required for after tx.
416 return cdns_uart->port->frame_time in cdns_calc_after_tx_delay()
417 + DIV_ROUND_UP(cdns_uart->port->frame_time, 7) in cdns_calc_after_tx_delay()
418 + (u64)cdns_uart->port->rs485.delay_rts_after_send * NSEC_PER_MSEC; in cdns_calc_after_tx_delay()
422 * cdns_uart_handle_tx - Handle the bytes to be transmitted.
429 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_handle_tx()
430 struct tty_port *tport = &port->state->port; in cdns_uart_handle_tx()
434 if (kfifo_is_empty(&tport->xmit_fifo) || uart_tx_stopped(port)) { in cdns_uart_handle_tx()
436 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IDR); in cdns_uart_handle_tx()
440 numbytes = port->fifosize; in cdns_uart_handle_tx()
442 !(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXFULL) && in cdns_uart_handle_tx()
444 writel(ch, port->membase + CDNS_UART_FIFO); in cdns_uart_handle_tx()
445 numbytes--; in cdns_uart_handle_tx()
448 if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS) in cdns_uart_handle_tx()
452 writel(CDNS_UART_IXR_TXEMPTY, cdns_uart->port->membase + CDNS_UART_IER); in cdns_uart_handle_tx()
454 if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED && in cdns_uart_handle_tx()
455 (kfifo_is_empty(&tport->xmit_fifo) || uart_tx_stopped(port))) { in cdns_uart_handle_tx()
456 hrtimer_update_function(&cdns_uart->tx_timer, cdns_rs485_rx_callback); in cdns_uart_handle_tx()
457 hrtimer_start(&cdns_uart->tx_timer, in cdns_uart_handle_tx()
463 * cdns_uart_isr - Interrupt handler
479 isrstatus = readl(port->membase + CDNS_UART_ISR); in cdns_uart_isr()
480 writel(isrstatus, port->membase + CDNS_UART_ISR); in cdns_uart_isr()
487 isrstatus &= port->read_status_mask; in cdns_uart_isr()
488 isrstatus &= ~port->ignore_status_mask; in cdns_uart_isr()
494 !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) in cdns_uart_isr()
502 * cdns_uart_calc_baud_divs - Calculate baud rate divisors
545 bauderror = baud - calc_baud; in cdns_uart_calc_baud_divs()
547 bauderror = calc_baud - baud; in cdns_uart_calc_baud_divs()
564 * cdns_uart_set_baud_rate - Calculate and set the baud rate
577 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_set_baud_rate()
579 calc_baud = cdns_uart_calc_baud_divs(port->uartclk, baud, &bdiv, &cd, in cdns_uart_set_baud_rate()
583 mreg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
588 writel(mreg, port->membase + CDNS_UART_MR); in cdns_uart_set_baud_rate()
589 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_uart_set_baud_rate()
590 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_uart_set_baud_rate()
591 cdns_uart->baud = baud; in cdns_uart_set_baud_rate()
598 * cdns_uart_clk_notifier_cb - Clock notifier callback
614 port = cdns_uart->port; in cdns_uart_clk_notifier_cb()
615 if (port->suspended) in cdns_uart_clk_notifier_cb()
625 * Find out if current baud-rate can be achieved with new clock in cdns_uart_clk_notifier_cb()
628 if (!cdns_uart_calc_baud_divs(ndata->new_rate, cdns_uart->baud, in cdns_uart_clk_notifier_cb()
630 dev_warn(port->dev, "clock rate change rejected\n"); in cdns_uart_clk_notifier_cb()
634 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
637 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
639 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
641 uart_port_unlock_irqrestore(cdns_uart->port, flags); in cdns_uart_clk_notifier_cb()
651 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
654 port->uartclk = ndata->new_rate; in cdns_uart_clk_notifier_cb()
656 cdns_uart->baud = cdns_uart_set_baud_rate(cdns_uart->port, in cdns_uart_clk_notifier_cb()
657 cdns_uart->baud); in cdns_uart_clk_notifier_cb()
661 uart_port_lock_irqsave(cdns_uart->port, &flags); in cdns_uart_clk_notifier_cb()
663 /* Set TX/RX Reset */ in cdns_uart_clk_notifier_cb()
664 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
666 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
668 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_clk_notifier_cb()
677 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_clk_notifier_cb()
678 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
681 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_clk_notifier_cb()
683 uart_port_unlock_irqrestore(cdns_uart->port, flags); in cdns_uart_clk_notifier_cb()
693 * cdns_rs485_tx_callback - Timer tx callback handler for rs485.
700 uart_port_lock(cdns_uart->port); in cdns_rs485_tx_callback()
701 cdns_uart_handle_tx(cdns_uart->port); in cdns_rs485_tx_callback()
702 uart_port_unlock(cdns_uart->port); in cdns_rs485_tx_callback()
708 * cdns_uart_start_tx - Start transmitting bytes
714 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_start_tx()
723 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
726 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_start_tx()
728 if (kfifo_is_empty(&port->state->port.xmit_fifo)) in cdns_uart_start_tx()
732 writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); in cdns_uart_start_tx()
734 if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED) { in cdns_uart_start_tx()
735 if (!cdns_uart->rs485_tx_started) { in cdns_uart_start_tx()
736 hrtimer_update_function(&cdns_uart->tx_timer, cdns_rs485_tx_callback); in cdns_uart_start_tx()
738 return hrtimer_start(&cdns_uart->tx_timer, in cdns_uart_start_tx()
739 ms_to_ktime(port->rs485.delay_rts_before_send), in cdns_uart_start_tx()
747 * cdns_uart_stop_tx - Stop TX
753 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_stop_tx()
755 if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED) in cdns_uart_stop_tx()
758 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
761 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_tx()
765 * cdns_uart_stop_rx - Stop RX
773 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IDR); in cdns_uart_stop_rx()
776 regval = readl(port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
778 writel(regval, port->membase + CDNS_UART_CR); in cdns_uart_stop_rx()
782 * cdns_uart_break_ctl - Based on the input ctl we have to start or stop
794 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
796 if (ctl == -1) in cdns_uart_break_ctl()
798 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
802 port->membase + CDNS_UART_CR); in cdns_uart_break_ctl()
808 * cdns_uart_set_termios - termios operations, handling data length, parity,
826 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
828 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
832 * min and max baud should be calculated here based on port->uartclk. in cdns_uart_set_termios()
835 minbaud = port->uartclk / in cdns_uart_set_termios()
837 maxbaud = port->uartclk / (CDNS_UART_BDIV_MIN + 1); in cdns_uart_set_termios()
843 /* Update the per-port timeout. */ in cdns_uart_set_termios()
844 uart_update_timeout(port, termios->c_cflag, baud); in cdns_uart_set_termios()
846 /* Set TX/RX Reset */ in cdns_uart_set_termios()
847 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
849 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
851 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_set_termios()
859 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
862 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_set_termios()
864 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_set_termios()
866 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
868 port->ignore_status_mask = 0; in cdns_uart_set_termios()
870 if (termios->c_iflag & INPCK) in cdns_uart_set_termios()
871 port->read_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
874 if (termios->c_iflag & IGNPAR) in cdns_uart_set_termios()
875 port->ignore_status_mask |= CDNS_UART_IXR_PARITY | in cdns_uart_set_termios()
879 if ((termios->c_cflag & CREAD) == 0) in cdns_uart_set_termios()
880 port->ignore_status_mask |= CDNS_UART_IXR_RXTRIG | in cdns_uart_set_termios()
884 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
887 switch (termios->c_cflag & CSIZE) { in cdns_uart_set_termios()
897 termios->c_cflag &= ~CSIZE; in cdns_uart_set_termios()
898 termios->c_cflag |= CS8; in cdns_uart_set_termios()
903 if (termios->c_cflag & CSTOPB) in cdns_uart_set_termios()
908 if (termios->c_cflag & PARENB) { in cdns_uart_set_termios()
910 if (termios->c_cflag & CMSPAR) { in cdns_uart_set_termios()
911 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
916 if (termios->c_cflag & PARODD) in cdns_uart_set_termios()
925 writel(cval, port->membase + CDNS_UART_MR); in cdns_uart_set_termios()
927 cval = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
928 if (termios->c_cflag & CRTSCTS) in cdns_uart_set_termios()
932 writel(cval, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_termios()
938 * cdns_uart_startup - Called when an application opens a cdns_uart port
945 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_startup()
951 is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; in cdns_uart_startup()
953 ret = reset_control_deassert(cdns_uart->rstc); in cdns_uart_startup()
961 port->membase + CDNS_UART_CR); in cdns_uart_startup()
963 /* Set the Control Register with TX/RX Enable, TX/RX Reset, in cdns_uart_startup()
967 port->membase + CDNS_UART_CR); in cdns_uart_startup()
969 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_startup()
973 if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED) in cdns_uart_startup()
980 status = readl(port->membase + CDNS_UART_CR); in cdns_uart_startup()
983 writel(status, port->membase + CDNS_UART_CR); in cdns_uart_startup()
990 port->membase + CDNS_UART_MR); in cdns_uart_startup()
996 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_startup()
1002 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_startup()
1005 writel(readl(port->membase + CDNS_UART_ISR), in cdns_uart_startup()
1006 port->membase + CDNS_UART_ISR); in cdns_uart_startup()
1010 ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port); in cdns_uart_startup()
1012 dev_err(port->dev, "request_irq '%d' failed with %d\n", in cdns_uart_startup()
1013 port->irq, ret); in cdns_uart_startup()
1020 port->membase + CDNS_UART_IER); in cdns_uart_startup()
1022 writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); in cdns_uart_startup()
1028 * cdns_uart_shutdown - Called when an application closes a cdns_uart port
1035 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_shutdown()
1037 if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED) in cdns_uart_shutdown()
1038 hrtimer_cancel(&cdns_uart->tx_timer); in cdns_uart_shutdown()
1043 status = readl(port->membase + CDNS_UART_IMR); in cdns_uart_shutdown()
1044 writel(status, port->membase + CDNS_UART_IDR); in cdns_uart_shutdown()
1045 writel(0xffffffff, port->membase + CDNS_UART_ISR); in cdns_uart_shutdown()
1049 port->membase + CDNS_UART_CR); in cdns_uart_shutdown()
1053 free_irq(port->irq, port); in cdns_uart_shutdown()
1057 * cdns_uart_type - Set UART type to cdns_uart port
1064 return port->type == PORT_XUARTPS ? CDNS_UART_NAME : NULL; in cdns_uart_type()
1068 * cdns_uart_verify_port - Verify the port params
1077 if (ser->type != PORT_UNKNOWN && ser->type != PORT_XUARTPS) in cdns_uart_verify_port()
1078 return -EINVAL; in cdns_uart_verify_port()
1079 if (port->irq != ser->irq) in cdns_uart_verify_port()
1080 return -EINVAL; in cdns_uart_verify_port()
1081 if (ser->io_type != UPIO_MEM) in cdns_uart_verify_port()
1082 return -EINVAL; in cdns_uart_verify_port()
1083 if (port->iobase != ser->port) in cdns_uart_verify_port()
1084 return -EINVAL; in cdns_uart_verify_port()
1085 if (ser->hub6 != 0) in cdns_uart_verify_port()
1086 return -EINVAL; in cdns_uart_verify_port()
1091 * cdns_uart_request_port - Claim the memory region attached to cdns_uart port,
1100 if (!request_mem_region(port->mapbase, port->mapsize, in cdns_uart_request_port()
1102 return -ENOMEM; in cdns_uart_request_port()
1105 port->membase = ioremap(port->mapbase, port->mapsize); in cdns_uart_request_port()
1106 if (!port->membase) { in cdns_uart_request_port()
1107 dev_err(port->dev, "Unable to map registers\n"); in cdns_uart_request_port()
1108 release_mem_region(port->mapbase, port->mapsize); in cdns_uart_request_port()
1109 return -ENOMEM; in cdns_uart_request_port()
1115 * cdns_uart_release_port - Release UART port
1123 release_mem_region(port->mapbase, port->mapsize); in cdns_uart_release_port()
1124 iounmap(port->membase); in cdns_uart_release_port()
1125 port->membase = NULL; in cdns_uart_release_port()
1129 * cdns_uart_config_port - Configure UART port
1136 port->type = PORT_XUARTPS; in cdns_uart_config_port()
1140 * cdns_uart_get_mctrl - Get the modem control state
1149 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_get_mctrl()
1151 if (cdns_uart_data->cts_override) in cdns_uart_get_mctrl()
1154 val = readl(port->membase + CDNS_UART_MODEMSR); in cdns_uart_get_mctrl()
1171 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_set_mctrl()
1173 if (cdns_uart_data->cts_override) in cdns_uart_set_mctrl()
1176 val = readl(port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1177 mode_reg = readl(port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1184 if (cdns_uart_data->gpiod_rts) in cdns_uart_set_mctrl()
1185 gpiod_set_value(cdns_uart_data->gpiod_rts, !(mctrl & TIOCM_RTS)); in cdns_uart_set_mctrl()
1193 writel(val, port->membase + CDNS_UART_MODEMCR); in cdns_uart_set_mctrl()
1194 writel(mode_reg, port->membase + CDNS_UART_MR); in cdns_uart_set_mctrl()
1206 if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY) in cdns_uart_poll_get_char()
1209 c = (unsigned char) readl(port->membase + CDNS_UART_FIFO); in cdns_uart_poll_get_char()
1223 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1227 writel(c, port->membase + CDNS_UART_FIFO); in cdns_uart_poll_put_char()
1230 while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY)) in cdns_uart_poll_put_char()
1242 pm_runtime_mark_last_busy(port->dev); in cdns_uart_pm()
1243 pm_runtime_put_autosuspend(port->dev); in cdns_uart_pm()
1246 pm_runtime_get_sync(port->dev); in cdns_uart_pm()
1278 * cdns_uart_console_putchar - write the character to the FIFO buffer
1289 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_putchar()
1293 dev_warn(port->dev, in cdns_uart_console_putchar()
1302 ctrl_reg = readl(port->membase + CDNS_UART_SR); in cdns_uart_console_putchar()
1307 dev_warn(port->dev, in cdns_uart_console_putchar()
1313 writel(ch, port->membase + CDNS_UART_FIFO); in cdns_uart_console_putchar()
1319 struct earlycon_device *dev = con->data; in cdns_early_write()
1321 uart_console_write(&dev->port, s, n, cdns_uart_console_putchar); in cdns_early_write()
1327 struct uart_port *port = &device->port; in cdns_early_console_setup()
1329 if (!port->membase) in cdns_early_console_setup()
1330 return -ENODEV; in cdns_early_console_setup()
1334 port->membase + CDNS_UART_CR); in cdns_early_console_setup()
1336 /* only set baud if specified on command line - otherwise in cdns_early_console_setup()
1339 if (port->uartclk && device->baud) { in cdns_early_console_setup()
1344 cdns_uart_calc_baud_divs(port->uartclk, device->baud, in cdns_early_console_setup()
1350 writel(mr, port->membase + CDNS_UART_MR); in cdns_early_console_setup()
1351 writel(cd, port->membase + CDNS_UART_BAUDGEN); in cdns_early_console_setup()
1352 writel(bdiv, port->membase + CDNS_UART_BAUDDIV); in cdns_early_console_setup()
1355 device->con->write = cdns_early_write; in cdns_early_console_setup()
1360 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
1361 OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
1362 OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
1369 * cdns_uart_console_write - perform write operation
1388 imr = readl(port->membase + CDNS_UART_IMR); in cdns_uart_console_write()
1389 writel(imr, port->membase + CDNS_UART_IDR); in cdns_uart_console_write()
1395 ctrl = readl(port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1398 writel(ctrl, port->membase + CDNS_UART_CR); in cdns_uart_console_write()
1405 writel(imr, port->membase + CDNS_UART_IER); in cdns_uart_console_write()
1412 * cdns_uart_console_setup - Initialize the uart to default config
1428 if (!port->membase) { in cdns_uart_console_setup()
1430 co->index); in cdns_uart_console_setup()
1431 return -ENODEV; in cdns_uart_console_setup()
1453 .index = -1, /* Specified on the cmdline (e.g. console=ttyPS ) */
1460 * cdns_uart_suspend - suspend event
1468 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_suspend()
1478 while (!(readl(port->membase + CDNS_UART_SR) & in cdns_uart_suspend()
1480 readl(port->membase + CDNS_UART_FIFO); in cdns_uart_suspend()
1482 writel(1, port->membase + CDNS_UART_RXWM); in cdns_uart_suspend()
1484 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR); in cdns_uart_suspend()
1492 return uart_suspend_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_suspend()
1496 * cdns_uart_resume - Resume after a previous suspend
1504 struct cdns_uart *cdns_uart = port->private_data; in cdns_uart_resume()
1513 ret = clk_enable(cdns_uart->pclk); in cdns_uart_resume()
1517 ret = clk_enable(cdns_uart->uartclk); in cdns_uart_resume()
1519 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1525 /* Set TX/RX Reset */ in cdns_uart_resume()
1526 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1528 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1529 while (readl(port->membase + CDNS_UART_CR) & in cdns_uart_resume()
1534 writel(rx_timeout, port->membase + CDNS_UART_RXTOUT); in cdns_uart_resume()
1536 ctrl_reg = readl(port->membase + CDNS_UART_CR); in cdns_uart_resume()
1539 writel(ctrl_reg, port->membase + CDNS_UART_CR); in cdns_uart_resume()
1541 clk_disable(cdns_uart->uartclk); in cdns_uart_resume()
1542 clk_disable(cdns_uart->pclk); in cdns_uart_resume()
1547 writel(rx_trigger_level, port->membase + CDNS_UART_RXWM); in cdns_uart_resume()
1549 writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER); in cdns_uart_resume()
1553 return uart_resume_port(cdns_uart->cdns_uart_driver, port); in cdns_uart_resume()
1559 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_suspend()
1561 clk_disable(cdns_uart->uartclk); in cdns_runtime_suspend()
1562 clk_disable(cdns_uart->pclk); in cdns_runtime_suspend()
1569 struct cdns_uart *cdns_uart = port->private_data; in cdns_runtime_resume()
1572 ret = clk_enable(cdns_uart->pclk); in cdns_runtime_resume()
1576 ret = clk_enable(cdns_uart->uartclk); in cdns_runtime_resume()
1578 clk_disable(cdns_uart->pclk); in cdns_runtime_resume()
1596 { .compatible = "cdns,uart-r1p8", },
1597 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def },
1598 { .compatible = "xlnx,zynqmp-uart", .data = &zynqmp_uart_def },
1607 * cdns_rs485_config - Called when an application calls TIOCSRS485 ioctl.
1618 struct cdns_uart *cdns_uart = port->private_data; in cdns_rs485_config()
1620 if (rs485->flags & SER_RS485_ENABLED) { in cdns_rs485_config()
1621 dev_dbg(port->dev, "Setting UART to RS485\n"); in cdns_rs485_config()
1623 val = readl(port->membase + CDNS_UART_MODEMCR); in cdns_rs485_config()
1625 writel(val, port->membase + CDNS_UART_MODEMCR); in cdns_rs485_config()
1628 hrtimer_setup(&cdns_uart->tx_timer, &cdns_rs485_tx_callback, CLOCK_MONOTONIC, in cdns_rs485_config()
1634 hrtimer_cancel(&cdns_uart->tx_timer); in cdns_rs485_config()
1640 * cdns_uart_probe - Platform driver probe
1653 cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), in cdns_uart_probe()
1656 return -ENOMEM; in cdns_uart_probe()
1657 port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL); in cdns_uart_probe()
1659 return -ENOMEM; in cdns_uart_probe()
1662 id = of_alias_get_id(pdev->dev.of_node, "serial"); in cdns_uart_probe()
1667 dev_err(&pdev->dev, "Cannot get uart_port structure\n"); in cdns_uart_probe()
1668 return -ENODEV; in cdns_uart_probe()
1684 dev_err(&pdev->dev, "Failed to register driver\n"); in cdns_uart_probe()
1689 cdns_uart_data->cdns_uart_driver = &cdns_uart_uart_driver; in cdns_uart_probe()
1691 match = of_match_node(cdns_uart_of_match, pdev->dev.of_node); in cdns_uart_probe()
1692 if (match && match->data) { in cdns_uart_probe()
1693 const struct cdns_platform_data *data = match->data; in cdns_uart_probe()
1695 cdns_uart_data->quirks = data->quirks; in cdns_uart_probe()
1698 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "pclk"); in cdns_uart_probe()
1699 if (PTR_ERR(cdns_uart_data->pclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1700 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1704 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1705 cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "aper_clk"); in cdns_uart_probe()
1706 if (IS_ERR(cdns_uart_data->pclk)) { in cdns_uart_probe()
1707 rc = PTR_ERR(cdns_uart_data->pclk); in cdns_uart_probe()
1710 dev_err(&pdev->dev, "clock name 'aper_clk' is deprecated.\n"); in cdns_uart_probe()
1713 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "uart_clk"); in cdns_uart_probe()
1714 if (PTR_ERR(cdns_uart_data->uartclk) == -EPROBE_DEFER) { in cdns_uart_probe()
1715 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1719 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1720 cdns_uart_data->uartclk = devm_clk_get(&pdev->dev, "ref_clk"); in cdns_uart_probe()
1721 if (IS_ERR(cdns_uart_data->uartclk)) { in cdns_uart_probe()
1722 rc = PTR_ERR(cdns_uart_data->uartclk); in cdns_uart_probe()
1725 dev_err(&pdev->dev, "clock name 'ref_clk' is deprecated.\n"); in cdns_uart_probe()
1728 cdns_uart_data->rstc = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); in cdns_uart_probe()
1729 if (IS_ERR(cdns_uart_data->rstc)) { in cdns_uart_probe()
1730 rc = PTR_ERR(cdns_uart_data->rstc); in cdns_uart_probe()
1731 dev_err_probe(&pdev->dev, rc, "Cannot get UART reset\n"); in cdns_uart_probe()
1735 rc = clk_prepare_enable(cdns_uart_data->pclk); in cdns_uart_probe()
1737 dev_err(&pdev->dev, "Unable to enable pclk clock.\n"); in cdns_uart_probe()
1740 rc = clk_prepare_enable(cdns_uart_data->uartclk); in cdns_uart_probe()
1742 dev_err(&pdev->dev, "Unable to enable device clock.\n"); in cdns_uart_probe()
1748 rc = -ENODEV; in cdns_uart_probe()
1759 cdns_uart_data->clk_rate_change_nb.notifier_call = in cdns_uart_probe()
1761 if (clk_notifier_register(cdns_uart_data->uartclk, in cdns_uart_probe()
1762 &cdns_uart_data->clk_rate_change_nb)) in cdns_uart_probe()
1763 dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); in cdns_uart_probe()
1767 spin_lock_init(&port->lock); in cdns_uart_probe()
1768 port->type = PORT_UNKNOWN; in cdns_uart_probe()
1769 port->iotype = UPIO_MEM32; in cdns_uart_probe()
1770 port->flags = UPF_BOOT_AUTOCONF; in cdns_uart_probe()
1771 port->ops = &cdns_uart_ops; in cdns_uart_probe()
1772 port->fifosize = CDNS_UART_FIFO_SIZE; in cdns_uart_probe()
1773 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_XILINX_PS_UART_CONSOLE); in cdns_uart_probe()
1774 port->line = id; in cdns_uart_probe()
1781 port->mapbase = res->start; in cdns_uart_probe()
1782 port->mapsize = resource_size(res); in cdns_uart_probe()
1783 port->irq = irq; in cdns_uart_probe()
1784 port->dev = &pdev->dev; in cdns_uart_probe()
1785 port->uartclk = clk_get_rate(cdns_uart_data->uartclk); in cdns_uart_probe()
1786 port->private_data = cdns_uart_data; in cdns_uart_probe()
1787 port->read_status_mask = CDNS_UART_IXR_TXEMPTY | CDNS_UART_IXR_RXTRIG | in cdns_uart_probe()
1789 port->rs485_config = cdns_rs485_config; in cdns_uart_probe()
1790 port->rs485_supported = cdns_rs485_supported; in cdns_uart_probe()
1791 cdns_uart_data->port = port; in cdns_uart_probe()
1798 cdns_uart_data->gpiod_rts = devm_gpiod_get_optional(&pdev->dev, "rts", in cdns_uart_probe()
1800 if (IS_ERR(cdns_uart_data->gpiod_rts)) { in cdns_uart_probe()
1801 rc = PTR_ERR(cdns_uart_data->gpiod_rts); in cdns_uart_probe()
1802 dev_err(port->dev, "xuartps: devm_gpiod_get_optional failed\n"); in cdns_uart_probe()
1806 pm_runtime_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1807 pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT); in cdns_uart_probe()
1808 pm_runtime_set_active(&pdev->dev); in cdns_uart_probe()
1809 pm_runtime_enable(&pdev->dev); in cdns_uart_probe()
1810 device_init_wakeup(port->dev, true); in cdns_uart_probe()
1824 if (cdns_uart_data->port->rs485.flags & SER_RS485_ENABLED) in cdns_uart_probe()
1829 dev_err(&pdev->dev, in cdns_uart_probe()
1839 cdns_uart_console.index = -1; in cdns_uart_probe()
1843 cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node, in cdns_uart_probe()
1844 "cts-override"); in cdns_uart_probe()
1851 pm_runtime_disable(&pdev->dev); in cdns_uart_probe()
1852 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_probe()
1853 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_probe()
1856 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_probe()
1857 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_probe()
1860 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_probe()
1862 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_probe()
1865 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_probe()
1870 * cdns_uart_remove - called when the platform driver is unregistered
1876 struct cdns_uart *cdns_uart_data = port->private_data; in cdns_uart_remove()
1880 clk_notifier_unregister(cdns_uart_data->uartclk, in cdns_uart_remove()
1881 &cdns_uart_data->clk_rate_change_nb); in cdns_uart_remove()
1883 uart_remove_one_port(cdns_uart_data->cdns_uart_driver, port); in cdns_uart_remove()
1884 port->mapbase = 0; in cdns_uart_remove()
1885 clk_disable_unprepare(cdns_uart_data->uartclk); in cdns_uart_remove()
1886 clk_disable_unprepare(cdns_uart_data->pclk); in cdns_uart_remove()
1887 pm_runtime_disable(&pdev->dev); in cdns_uart_remove()
1888 pm_runtime_set_suspended(&pdev->dev); in cdns_uart_remove()
1889 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_uart_remove()
1890 device_init_wakeup(&pdev->dev, false); in cdns_uart_remove()
1896 reset_control_assert(cdns_uart_data->rstc); in cdns_uart_remove()
1898 if (!--instances) in cdns_uart_remove()
1899 uart_unregister_driver(cdns_uart_data->cdns_uart_driver); in cdns_uart_remove()