• Home
  • Raw
  • Download

Lines Matching +full:rx +full:- +full:int +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
9 * Copyright 2014 Oleksij Rempel <linux@rempel-privat.de>
11 * Copyright 2008-2010 Freescale Semiconductor, Inc.
38 #include <linux/dma-mapping.h>
130 * RW. Tell the UART to execute the RX DMA Command. The
137 * RW. RX TIMEOUT Enable. Valid for FIFO and DMA.
138 * Warning: If this bit is set to 0, the RX timeout will not affect receive DMA
144 * RW. Receive Timeout Counter Value: number of 8-bit-time to wait before
145 * asserting timeout on the RX input. If the RXFIFO is not empty and the RX
146 * input is idle, then the watchdog counter will decrement each bit-time. Note
147 * 7-bit-time is added to the programmed value, so a value of zero will set
148 * the counter to 7-bit-time, a value of 0x1 gives 15-bit-time and so on. Also
151 * occur (when FIFO is not empty) even if the RX input is not idle. The default
152 * value is 0x3 (31 bit-time).
224 /* Auto-Boud Timeout */
290 /* RW. Enable RS-485/EIA-485 Normal Multidrop Mode (NMM) */
305 /* WO. Auto-baud time-out interrupt clear bit. */
307 /* WO. End of auto-baud interrupt clear bit. */
309 /* Restart in case of timeout (counter restarts at next UART Rx falling edge) */
311 /* Auto-baud mode select bit. 0 - Mode 0, 1 - Mode 1. */
314 * Auto-baud start (auto-baud is running). Auto-baud run bit. This bit is
315 * automatically cleared after auto-baud completion.
326 /* RW. Baud Rate Mode: 1 - Enable sync mode. 0 - async mode. */
328 /* RW. 1 - MSB bit send frist; 0 - LSB bit frist. */
330 /* RW. 1 - sample rate = 8 x Baudrate; 0 - sample rate = 16 x Baudrate. */
332 /* RW. 1 - Set word length to 9bit. 0 - use ASM9260_BM_LCTRL_WLEN */
344 /* RW. 1 - ISO7816 mode; 0 - USART mode */
382 /* The size of the array - must be last */
428 unsigned int mctrl_prev;
445 struct mctrl_gpios *gpios; member
446 int gpio_irq[UART_GPIO_MAX];
451 { .name = "mxs-auart-imx23", .driver_data = IMX23_AUART },
452 { .name = "mxs-auart-imx28", .driver_data = IMX28_AUART },
453 { .name = "as-auart-asm9260", .driver_data = ASM9260_AUART },
460 .compatible = "fsl,imx28-auart",
463 .compatible = "fsl,imx23-auart",
466 .compatible = "alphascale,asm9260-auart",
472 static inline int is_imx28_auart(struct mxs_auart_port *s) in is_imx28_auart()
474 return s->devtype == IMX28_AUART; in is_imx28_auart()
477 static inline int is_asm9260_auart(struct mxs_auart_port *s) in is_asm9260_auart()
479 return s->devtype == ASM9260_AUART; in is_asm9260_auart()
484 return s->flags & MXS_AUART_DMA_ENABLED; in auart_dma_enabled()
487 static unsigned int mxs_reg_to_offset(const struct mxs_auart_port *uap, in mxs_reg_to_offset()
488 unsigned int reg) in mxs_reg_to_offset()
490 return uap->vendor->reg_offset[reg]; in mxs_reg_to_offset()
493 static unsigned int mxs_read(const struct mxs_auart_port *uap, in mxs_read()
494 unsigned int reg) in mxs_read()
496 void __iomem *addr = uap->port.membase + mxs_reg_to_offset(uap, reg); in mxs_read()
501 static void mxs_write(unsigned int val, struct mxs_auart_port *uap, in mxs_write()
502 unsigned int reg) in mxs_write()
504 void __iomem *addr = uap->port.membase + mxs_reg_to_offset(uap, reg); in mxs_write()
509 static void mxs_set(unsigned int val, struct mxs_auart_port *uap, in mxs_set()
510 unsigned int reg) in mxs_set()
512 void __iomem *addr = uap->port.membase + mxs_reg_to_offset(uap, reg); in mxs_set()
517 static void mxs_clr(unsigned int val, struct mxs_auart_port *uap, in mxs_clr()
518 unsigned int reg) in mxs_clr()
520 void __iomem *addr = uap->port.membase + mxs_reg_to_offset(uap, reg); in mxs_clr()
534 struct circ_buf *xmit = &s->port.state->xmit; in dma_tx_callback()
536 dma_unmap_sg(s->dev, &s->tx_sgl, 1, DMA_TO_DEVICE); in dma_tx_callback()
539 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in dma_tx_callback()
544 uart_write_wakeup(&s->port); in dma_tx_callback()
549 static int mxs_auart_dma_tx(struct mxs_auart_port *s, int size) in mxs_auart_dma_tx()
552 struct scatterlist *sgl = &s->tx_sgl; in mxs_auart_dma_tx()
553 struct dma_chan *channel = s->tx_dma_chan; in mxs_auart_dma_tx()
561 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_tx()
562 return -EINVAL; in mxs_auart_dma_tx()
566 sg_init_one(sgl, s->tx_dma_buf, size); in mxs_auart_dma_tx()
567 dma_map_sg(s->dev, sgl, 1, DMA_TO_DEVICE); in mxs_auart_dma_tx()
571 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_tx()
572 return -EINVAL; in mxs_auart_dma_tx()
576 desc->callback = dma_tx_callback; in mxs_auart_dma_tx()
577 desc->callback_param = s; in mxs_auart_dma_tx()
585 struct circ_buf *xmit = &s->port.state->xmit; in mxs_auart_tx_chars()
589 int size; in mxs_auart_tx_chars()
590 void *buffer = s->tx_dma_buf; in mxs_auart_tx_chars()
592 if (test_and_set_bit(MXS_AUART_DMA_TX_SYNC, &s->flags)) in mxs_auart_tx_chars()
595 while (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
596 size = min_t(u32, UART_XMIT_SIZE - i, in mxs_auart_tx_chars()
597 CIRC_CNT_TO_END(xmit->head, in mxs_auart_tx_chars()
598 xmit->tail, in mxs_auart_tx_chars()
600 memcpy(buffer + i, xmit->buf + xmit->tail, size); in mxs_auart_tx_chars()
601 xmit->tail = (xmit->tail + size) & (UART_XMIT_SIZE - 1); in mxs_auart_tx_chars()
608 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
609 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
614 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_tx_chars()
622 if (s->port.x_char) { in mxs_auart_tx_chars()
623 s->port.icount.tx++; in mxs_auart_tx_chars()
624 mxs_write(s->port.x_char, s, REG_DATA); in mxs_auart_tx_chars()
625 s->port.x_char = 0; in mxs_auart_tx_chars()
628 if (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
629 s->port.icount.tx++; in mxs_auart_tx_chars()
630 mxs_write(xmit->buf[xmit->tail], s, REG_DATA); in mxs_auart_tx_chars()
631 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in mxs_auart_tx_chars()
636 uart_write_wakeup(&s->port); in mxs_auart_tx_chars()
638 if (uart_circ_empty(&(s->port.state->xmit))) in mxs_auart_tx_chars()
643 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
644 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
649 int flag; in mxs_auart_rx_char()
657 s->port.icount.rx++; in mxs_auart_rx_char()
660 s->port.icount.brk++; in mxs_auart_rx_char()
661 if (uart_handle_break(&s->port)) in mxs_auart_rx_char()
664 s->port.icount.parity++; in mxs_auart_rx_char()
666 s->port.icount.frame++; in mxs_auart_rx_char()
672 stat &= s->port.read_status_mask; in mxs_auart_rx_char()
682 s->port.icount.overrun++; in mxs_auart_rx_char()
684 if (uart_handle_sysrq_char(&s->port, c)) in mxs_auart_rx_char()
687 uart_insert_char(&s->port, stat, AUART_STAT_OERR, c, flag); in mxs_auart_rx_char()
704 tty_flip_buffer_push(&s->port.state->port); in mxs_auart_rx_chars()
707 static int mxs_auart_request_port(struct uart_port *u) in mxs_auart_request_port()
712 static int mxs_auart_verify_port(struct uart_port *u, in mxs_auart_verify_port()
715 if (u->type != PORT_UNKNOWN && u->type != PORT_IMX) in mxs_auart_verify_port()
716 return -EINVAL; in mxs_auart_verify_port()
720 static void mxs_auart_config_port(struct uart_port *u, int flags) in mxs_auart_config_port()
728 return dev_name(s->dev); in mxs_auart_type()
751 mctrl_gpio_set(s->gpios, mctrl); in mxs_auart_set_mctrl()
759 mctrl_diff = mctrl ^ s->mctrl_prev; in mxs_auart_modem_status()
760 s->mctrl_prev = mctrl; in mxs_auart_modem_status()
761 if (mctrl_diff & MCTRL_ANY_DELTA && s->ms_irq_enabled && in mxs_auart_modem_status()
762 s->port.state != NULL) { in mxs_auart_modem_status()
764 s->port.icount.rng++; in mxs_auart_modem_status()
766 s->port.icount.dsr++; in mxs_auart_modem_status()
768 uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD); in mxs_auart_modem_status()
770 uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS); in mxs_auart_modem_status()
772 wake_up_interruptible(&s->port.state->port.delta_msr_wait); in mxs_auart_modem_status()
786 return mctrl_gpio_get(s->gpios, &mctrl); in mxs_auart_get_mctrl()
799 if (s->ms_irq_enabled) in mxs_auart_enable_ms()
802 s->ms_irq_enabled = true; in mxs_auart_enable_ms()
804 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_enable_ms()
805 enable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_enable_ms()
808 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_enable_ms()
809 enable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_enable_ms()
811 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_enable_ms()
812 enable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_enable_ms()
814 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_enable_ms()
815 enable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_enable_ms()
828 if (!s->ms_irq_enabled) in mxs_auart_disable_ms()
831 s->ms_irq_enabled = false; in mxs_auart_disable_ms()
833 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_disable_ms()
834 disable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_disable_ms()
837 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_disable_ms()
838 disable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_disable_ms()
840 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_disable_ms()
841 disable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_disable_ms()
843 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_disable_ms()
844 disable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_disable_ms()
847 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
851 struct tty_port *port = &s->port.state->port; in dma_rx_callback()
852 int count; in dma_rx_callback()
855 dma_unmap_sg(s->dev, &s->rx_sgl, 1, DMA_FROM_DEVICE); in dma_rx_callback()
862 tty_insert_flip_string(port, s->rx_dma_buf, count); in dma_rx_callback()
867 /* start the next DMA for RX. */ in dma_rx_callback()
871 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s) in mxs_auart_dma_prep_rx()
874 struct scatterlist *sgl = &s->rx_sgl; in mxs_auart_dma_prep_rx()
875 struct dma_chan *channel = s->rx_dma_chan; in mxs_auart_dma_prep_rx()
885 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_prep_rx()
886 return -EINVAL; in mxs_auart_dma_prep_rx()
890 sg_init_one(sgl, s->rx_dma_buf, UART_XMIT_SIZE); in mxs_auart_dma_prep_rx()
891 dma_map_sg(s->dev, sgl, 1, DMA_FROM_DEVICE); in mxs_auart_dma_prep_rx()
895 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_prep_rx()
896 return -1; in mxs_auart_dma_prep_rx()
900 desc->callback = dma_rx_callback; in mxs_auart_dma_prep_rx()
901 desc->callback_param = s; in mxs_auart_dma_prep_rx()
909 if (s->tx_dma_chan) { in mxs_auart_dma_exit_channel()
910 dma_release_channel(s->tx_dma_chan); in mxs_auart_dma_exit_channel()
911 s->tx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
913 if (s->rx_dma_chan) { in mxs_auart_dma_exit_channel()
914 dma_release_channel(s->rx_dma_chan); in mxs_auart_dma_exit_channel()
915 s->rx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
918 kfree(s->tx_dma_buf); in mxs_auart_dma_exit_channel()
919 kfree(s->rx_dma_buf); in mxs_auart_dma_exit_channel()
920 s->tx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
921 s->rx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
931 s->flags &= ~MXS_AUART_DMA_ENABLED; in mxs_auart_dma_exit()
932 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_dma_exit()
933 clear_bit(MXS_AUART_DMA_RX_READY, &s->flags); in mxs_auart_dma_exit()
936 static int mxs_auart_dma_init(struct mxs_auart_port *s) in mxs_auart_dma_init()
941 /* init for RX */ in mxs_auart_dma_init()
942 s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx"); in mxs_auart_dma_init()
943 if (!s->rx_dma_chan) in mxs_auart_dma_init()
945 s->rx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
946 if (!s->rx_dma_buf) in mxs_auart_dma_init()
950 s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx"); in mxs_auart_dma_init()
951 if (!s->tx_dma_chan) in mxs_auart_dma_init()
953 s->tx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
954 if (!s->tx_dma_buf) in mxs_auart_dma_init()
958 s->flags |= MXS_AUART_DMA_ENABLED; in mxs_auart_dma_init()
959 dev_dbg(s->dev, "enabled the DMA support."); in mxs_auart_dma_init()
962 s->port.fifosize = UART_XMIT_SIZE; in mxs_auart_dma_init()
968 return -EINVAL; in mxs_auart_dma_init()
972 #define RTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
974 #define CTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
982 unsigned int cflag, baud, baud_min, baud_max; in mxs_auart_settermios()
984 cflag = termios->c_cflag; in mxs_auart_settermios()
1018 u->read_status_mask = AUART_STAT_OERR; in mxs_auart_settermios()
1020 if (termios->c_iflag & INPCK) in mxs_auart_settermios()
1021 u->read_status_mask |= AUART_STAT_PERR; in mxs_auart_settermios()
1022 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in mxs_auart_settermios()
1023 u->read_status_mask |= AUART_STAT_BERR; in mxs_auart_settermios()
1028 u->ignore_status_mask = 0; in mxs_auart_settermios()
1029 if (termios->c_iflag & IGNPAR) in mxs_auart_settermios()
1030 u->ignore_status_mask |= AUART_STAT_PERR; in mxs_auart_settermios()
1031 if (termios->c_iflag & IGNBRK) { in mxs_auart_settermios()
1032 u->ignore_status_mask |= AUART_STAT_BERR; in mxs_auart_settermios()
1037 if (termios->c_iflag & IGNPAR) in mxs_auart_settermios()
1038 u->ignore_status_mask |= AUART_STAT_OERR; in mxs_auart_settermios()
1063 && test_bit(MXS_AUART_RTSCTS, &s->flags)) { in mxs_auart_settermios()
1079 u->uartclk * 4 / 0x3FFFFF, in mxs_auart_settermios()
1080 u->uartclk / 16); in mxs_auart_settermios()
1081 div = u->uartclk * 4 / baud; in mxs_auart_settermios()
1083 baud_min = DIV_ROUND_UP(u->uartclk * 32, in mxs_auart_settermios()
1085 baud_max = u->uartclk * 32 / AUART_LINECTRL_BAUD_DIV_MIN; in mxs_auart_settermios()
1087 div = DIV_ROUND_CLOSEST(u->uartclk * 32, baud); in mxs_auart_settermios()
1096 uart_update_timeout(u, termios->c_cflag, baud); in mxs_auart_settermios()
1098 /* prepare for the DMA RX. */ in mxs_auart_settermios()
1100 !test_and_set_bit(MXS_AUART_DMA_RX_READY, &s->flags)) { in mxs_auart_settermios()
1102 /* Disable the normal RX interrupt. */ in mxs_auart_settermios()
1107 dev_err(s->dev, "We can not start up the DMA.\n"); in mxs_auart_settermios()
1111 /* CTS flow-control and modem-status interrupts */ in mxs_auart_settermios()
1112 if (UART_ENABLE_MS(u, termios->c_cflag)) in mxs_auart_settermios()
1121 if (termios->c_line == N_PPS) { in mxs_auart_set_ldisc()
1122 port->flags |= UPF_HARDPPS_CD; in mxs_auart_set_ldisc()
1125 port->flags &= ~UPF_HARDPPS_CD; in mxs_auart_set_ldisc()
1129 static irqreturn_t mxs_auart_irq_handle(int irq, void *context) in mxs_auart_irq_handle()
1133 u32 mctrl_temp = s->mctrl_prev; in mxs_auart_irq_handle()
1145 if (irq == s->gpio_irq[UART_GPIO_CTS] || in mxs_auart_irq_handle()
1146 irq == s->gpio_irq[UART_GPIO_DCD] || in mxs_auart_irq_handle()
1147 irq == s->gpio_irq[UART_GPIO_DSR] || in mxs_auart_irq_handle()
1148 irq == s->gpio_irq[UART_GPIO_RI]) in mxs_auart_irq_handle()
1150 mctrl_gpio_get(s->gpios, &mctrl_temp)); in mxs_auart_irq_handle()
1153 if (CTS_AT_AUART() && s->ms_irq_enabled) in mxs_auart_irq_handle()
1154 uart_handle_cts_change(&s->port, in mxs_auart_irq_handle()
1176 int i; in mxs_auart_reset_deassert()
1177 unsigned int reg; in mxs_auart_reset_deassert()
1192 int i; in mxs_auart_reset_assert()
1211 dev_err(s->dev, "Failed to reset the unit."); in mxs_auart_reset_assert()
1214 static int mxs_auart_startup(struct uart_port *u) in mxs_auart_startup()
1216 int ret; in mxs_auart_startup()
1219 ret = clk_prepare_enable(s->clk); in mxs_auart_startup()
1237 u->fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_startup()
1246 mctrl_gpio_get(s->gpios, &s->mctrl_prev); in mxs_auart_startup()
1248 s->ms_irq_enabled = false; in mxs_auart_startup()
1271 clk_disable_unprepare(s->clk); in mxs_auart_shutdown()
1274 static unsigned int mxs_auart_tx_empty(struct uart_port *u) in mxs_auart_tx_empty()
1309 static void mxs_auart_break_ctl(struct uart_port *u, int ctl) in mxs_auart_break_ctl()
1342 static void mxs_auart_console_putchar(struct uart_port *port, int ch) in mxs_auart_console_putchar()
1345 unsigned int to = 1000; in mxs_auart_console_putchar()
1348 if (!to--) in mxs_auart_console_putchar()
1357 auart_console_write(struct console *co, const char *str, unsigned int count) in auart_console_write()
1361 unsigned int old_ctrl0, old_ctrl2; in auart_console_write()
1362 unsigned int to = 20000; in auart_console_write()
1364 if (co->index >= MXS_AUART_PORTS || co->index < 0) in auart_console_write()
1367 s = auart_port[co->index]; in auart_console_write()
1368 port = &s->port; in auart_console_write()
1370 clk_enable(s->clk); in auart_console_write()
1384 if (!to--) in auart_console_write()
1399 clk_disable(s->clk); in auart_console_write()
1403 auart_console_get_options(struct mxs_auart_port *s, int *baud, in auart_console_get_options()
1404 int *parity, int *bits) in auart_console_get_options()
1406 struct uart_port *port = &s->port; in auart_console_get_options()
1407 unsigned int lcr_h, quot; in auart_console_get_options()
1428 >> (AUART_LINECTRL_BAUD_DIVINT_SHIFT - 6); in auart_console_get_options()
1434 *baud = (port->uartclk << 2) / quot; in auart_console_get_options()
1437 static int __init
1441 int baud = 9600; in auart_console_setup()
1442 int bits = 8; in auart_console_setup()
1443 int parity = 'n'; in auart_console_setup()
1444 int flow = 'n'; in auart_console_setup()
1445 int ret; in auart_console_setup()
1452 if (co->index == -1 || co->index >= ARRAY_SIZE(auart_port)) in auart_console_setup()
1453 co->index = 0; in auart_console_setup()
1454 s = auart_port[co->index]; in auart_console_setup()
1456 return -ENODEV; in auart_console_setup()
1458 ret = clk_prepare_enable(s->clk); in auart_console_setup()
1467 ret = uart_set_options(&s->port, co, baud, parity, bits, flow); in auart_console_setup()
1469 clk_disable_unprepare(s->clk); in auart_console_setup()
1480 .index = -1,
1500 s->vendor = &vendor_alphascale_asm9260; in mxs_init_regs()
1502 s->vendor = &vendor_freescale_stmp37xx; in mxs_init_regs()
1505 static int mxs_get_clks(struct mxs_auart_port *s, in mxs_get_clks()
1508 int err; in mxs_get_clks()
1511 s->clk = devm_clk_get(&pdev->dev, NULL); in mxs_get_clks()
1512 return PTR_ERR_OR_ZERO(s->clk); in mxs_get_clks()
1515 s->clk = devm_clk_get(s->dev, "mod"); in mxs_get_clks()
1516 if (IS_ERR(s->clk)) { in mxs_get_clks()
1517 dev_err(s->dev, "Failed to get \"mod\" clk\n"); in mxs_get_clks()
1518 return PTR_ERR(s->clk); in mxs_get_clks()
1521 s->clk_ahb = devm_clk_get(s->dev, "ahb"); in mxs_get_clks()
1522 if (IS_ERR(s->clk_ahb)) { in mxs_get_clks()
1523 dev_err(s->dev, "Failed to get \"ahb\" clk\n"); in mxs_get_clks()
1524 return PTR_ERR(s->clk_ahb); in mxs_get_clks()
1527 err = clk_prepare_enable(s->clk_ahb); in mxs_get_clks()
1529 dev_err(s->dev, "Failed to enable ahb_clk!\n"); in mxs_get_clks()
1533 err = clk_set_rate(s->clk, clk_get_rate(s->clk_ahb)); in mxs_get_clks()
1535 dev_err(s->dev, "Failed to set rate!\n"); in mxs_get_clks()
1539 err = clk_prepare_enable(s->clk); in mxs_get_clks()
1541 dev_err(s->dev, "Failed to enable clk!\n"); in mxs_get_clks()
1548 clk_disable_unprepare(s->clk_ahb); in mxs_get_clks()
1556 static int serial_mxs_probe_dt(struct mxs_auart_port *s, in serial_mxs_probe_dt()
1559 struct device_node *np = pdev->dev.of_node; in serial_mxs_probe_dt()
1560 int ret; in serial_mxs_probe_dt()
1568 dev_err(&pdev->dev, "failed to get alias id: %d\n", ret); in serial_mxs_probe_dt()
1571 s->port.line = ret; in serial_mxs_probe_dt()
1573 if (of_get_property(np, "uart-has-rtscts", NULL) || in serial_mxs_probe_dt()
1574 of_get_property(np, "fsl,uart-has-rtscts", NULL) /* deprecated */) in serial_mxs_probe_dt()
1575 set_bit(MXS_AUART_RTSCTS, &s->flags); in serial_mxs_probe_dt()
1580 static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) in mxs_auart_init_gpios()
1585 s->gpios = mctrl_gpio_init_noauto(dev, 0); in mxs_auart_init_gpios()
1586 if (IS_ERR(s->gpios)) in mxs_auart_init_gpios()
1587 return PTR_ERR(s->gpios); in mxs_auart_init_gpios()
1591 if (test_bit(MXS_AUART_RTSCTS, &s->flags)) in mxs_auart_init_gpios()
1594 clear_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_init_gpios()
1598 gpiod = mctrl_gpio_to_gpiod(s->gpios, i); in mxs_auart_init_gpios()
1600 s->gpio_irq[i] = gpiod_to_irq(gpiod); in mxs_auart_init_gpios()
1602 s->gpio_irq[i] = -EINVAL; in mxs_auart_init_gpios()
1613 if (s->gpio_irq[i] >= 0) in mxs_auart_free_gpio_irq()
1614 free_irq(s->gpio_irq[i], s); in mxs_auart_free_gpio_irq()
1617 static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) in mxs_auart_request_gpio_irq()
1619 int *irq = s->gpio_irq; in mxs_auart_request_gpio_irq()
1621 int err = 0; in mxs_auart_request_gpio_irq()
1629 IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); in mxs_auart_request_gpio_irq()
1631 dev_err(s->dev, "%s - Can't get %d irq\n", in mxs_auart_request_gpio_irq()
1639 while (err && (i-- > 0)) in mxs_auart_request_gpio_irq()
1646 static int mxs_auart_probe(struct platform_device *pdev) in mxs_auart_probe()
1649 of_match_device(mxs_auart_dt_ids, &pdev->dev); in mxs_auart_probe()
1652 int ret, irq; in mxs_auart_probe()
1655 s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); in mxs_auart_probe()
1657 return -ENOMEM; in mxs_auart_probe()
1659 s->port.dev = &pdev->dev; in mxs_auart_probe()
1660 s->dev = &pdev->dev; in mxs_auart_probe()
1664 s->port.line = pdev->id < 0 ? 0 : pdev->id; in mxs_auart_probe()
1667 if (s->port.line >= ARRAY_SIZE(auart_port)) { in mxs_auart_probe()
1668 dev_err(&pdev->dev, "serial%d out of range\n", s->port.line); in mxs_auart_probe()
1669 return -EINVAL; in mxs_auart_probe()
1673 pdev->id_entry = of_id->data; in mxs_auart_probe()
1674 s->devtype = pdev->id_entry->driver_data; in mxs_auart_probe()
1683 ret = -ENXIO; in mxs_auart_probe()
1687 s->port.mapbase = r->start; in mxs_auart_probe()
1688 s->port.membase = ioremap(r->start, resource_size(r)); in mxs_auart_probe()
1689 if (!s->port.membase) { in mxs_auart_probe()
1690 ret = -ENOMEM; in mxs_auart_probe()
1693 s->port.ops = &mxs_auart_ops; in mxs_auart_probe()
1694 s->port.iotype = UPIO_MEM; in mxs_auart_probe()
1695 s->port.fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_probe()
1696 s->port.uartclk = clk_get_rate(s->clk); in mxs_auart_probe()
1697 s->port.type = PORT_IMX; in mxs_auart_probe()
1701 s->mctrl_prev = 0; in mxs_auart_probe()
1709 s->port.irq = irq; in mxs_auart_probe()
1710 ret = devm_request_irq(&pdev->dev, irq, mxs_auart_irq_handle, 0, in mxs_auart_probe()
1711 dev_name(&pdev->dev), s); in mxs_auart_probe()
1717 ret = mxs_auart_init_gpios(s, &pdev->dev); in mxs_auart_probe()
1719 dev_err(&pdev->dev, "Failed to initialize GPIOs.\n"); in mxs_auart_probe()
1730 auart_port[s->port.line] = s; in mxs_auart_probe()
1734 ret = uart_add_one_port(&auart_driver, &s->port); in mxs_auart_probe()
1740 dev_info(&pdev->dev, "Found APPUART ASM9260\n"); in mxs_auart_probe()
1743 dev_info(&pdev->dev, "Found APPUART %d.%d.%d\n", in mxs_auart_probe()
1752 auart_port[pdev->id] = NULL; in mxs_auart_probe()
1755 iounmap(s->port.membase); in mxs_auart_probe()
1759 clk_disable_unprepare(s->clk); in mxs_auart_probe()
1760 clk_disable_unprepare(s->clk_ahb); in mxs_auart_probe()
1765 static int mxs_auart_remove(struct platform_device *pdev) in mxs_auart_remove()
1769 uart_remove_one_port(&auart_driver, &s->port); in mxs_auart_remove()
1770 auart_port[pdev->id] = NULL; in mxs_auart_remove()
1772 iounmap(s->port.membase); in mxs_auart_remove()
1774 clk_disable_unprepare(s->clk); in mxs_auart_remove()
1775 clk_disable_unprepare(s->clk_ahb); in mxs_auart_remove()
1785 .name = "mxs-auart",
1790 static int __init mxs_auart_init(void) in mxs_auart_init()
1792 int r; in mxs_auart_init()
1819 MODULE_ALIAS("platform:mxs-auart");