Lines Matching refs:s

458 static inline int is_imx28_auart(struct mxs_auart_port *s)  in is_imx28_auart()  argument
460 return s->devtype == IMX28_AUART; in is_imx28_auart()
463 static inline int is_asm9260_auart(struct mxs_auart_port *s) in is_asm9260_auart() argument
465 return s->devtype == ASM9260_AUART; in is_asm9260_auart()
468 static inline bool auart_dma_enabled(struct mxs_auart_port *s) in auart_dma_enabled() argument
470 return s->flags & MXS_AUART_DMA_ENABLED; in auart_dma_enabled()
515 static void mxs_auart_tx_chars(struct mxs_auart_port *s);
519 struct mxs_auart_port *s = param; in dma_tx_callback() local
520 struct circ_buf *xmit = &s->port.state->xmit; in dma_tx_callback()
522 dma_unmap_sg(s->dev, &s->tx_sgl, 1, DMA_TO_DEVICE); in dma_tx_callback()
525 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in dma_tx_callback()
530 uart_write_wakeup(&s->port); in dma_tx_callback()
532 mxs_auart_tx_chars(s); in dma_tx_callback()
535 static int mxs_auart_dma_tx(struct mxs_auart_port *s, int size) in mxs_auart_dma_tx() argument
538 struct scatterlist *sgl = &s->tx_sgl; in mxs_auart_dma_tx()
539 struct dma_chan *channel = s->tx_dma_chan; in mxs_auart_dma_tx()
547 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_tx()
552 sg_init_one(sgl, s->tx_dma_buf, size); in mxs_auart_dma_tx()
553 dma_map_sg(s->dev, sgl, 1, DMA_TO_DEVICE); in mxs_auart_dma_tx()
557 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_tx()
563 desc->callback_param = s; in mxs_auart_dma_tx()
569 static void mxs_auart_tx_chars(struct mxs_auart_port *s) in mxs_auart_tx_chars() argument
571 struct circ_buf *xmit = &s->port.state->xmit; in mxs_auart_tx_chars()
575 if (auart_dma_enabled(s)) { in mxs_auart_tx_chars()
578 void *buffer = s->tx_dma_buf; in mxs_auart_tx_chars()
580 if (test_and_set_bit(MXS_AUART_DMA_TX_SYNC, &s->flags)) in mxs_auart_tx_chars()
583 while (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
596 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
597 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
600 mxs_auart_dma_tx(s, i); in mxs_auart_tx_chars()
602 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_tx_chars()
608 pending = uart_port_tx_flags(&s->port, ch, UART_TX_NOSTOP, in mxs_auart_tx_chars()
609 !(mxs_read(s, REG_STAT) & AUART_STAT_TXFF), in mxs_auart_tx_chars()
610 mxs_write(ch, s, REG_DATA)); in mxs_auart_tx_chars()
612 mxs_set(AUART_INTR_TXIEN, s, REG_INTR); in mxs_auart_tx_chars()
614 mxs_clr(AUART_INTR_TXIEN, s, REG_INTR); in mxs_auart_tx_chars()
616 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
617 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
620 static void mxs_auart_rx_char(struct mxs_auart_port *s) in mxs_auart_rx_char() argument
625 c = mxs_read(s, REG_DATA); in mxs_auart_rx_char()
626 stat = mxs_read(s, REG_STAT); in mxs_auart_rx_char()
629 s->port.icount.rx++; in mxs_auart_rx_char()
632 s->port.icount.brk++; in mxs_auart_rx_char()
633 if (uart_handle_break(&s->port)) in mxs_auart_rx_char()
636 s->port.icount.parity++; in mxs_auart_rx_char()
638 s->port.icount.frame++; in mxs_auart_rx_char()
644 stat &= s->port.read_status_mask; in mxs_auart_rx_char()
654 s->port.icount.overrun++; in mxs_auart_rx_char()
656 if (uart_handle_sysrq_char(&s->port, c)) in mxs_auart_rx_char()
659 uart_insert_char(&s->port, stat, AUART_STAT_OERR, c, flag); in mxs_auart_rx_char()
661 mxs_write(stat, s, REG_STAT); in mxs_auart_rx_char()
664 static void mxs_auart_rx_chars(struct mxs_auart_port *s) in mxs_auart_rx_chars() argument
669 stat = mxs_read(s, REG_STAT); in mxs_auart_rx_chars()
672 mxs_auart_rx_char(s); in mxs_auart_rx_chars()
675 mxs_write(stat, s, REG_STAT); in mxs_auart_rx_chars()
676 tty_flip_buffer_push(&s->port.state->port); in mxs_auart_rx_chars()
698 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_type() local
700 return dev_name(s->dev); in mxs_auart_type()
709 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_set_mctrl() local
711 u32 ctrl = mxs_read(s, REG_CTRL2); in mxs_auart_set_mctrl()
721 mxs_write(ctrl, s, REG_CTRL2); in mxs_auart_set_mctrl()
723 mctrl_gpio_set(s->gpios, mctrl); in mxs_auart_set_mctrl()
727 static u32 mxs_auart_modem_status(struct mxs_auart_port *s, u32 mctrl) in mxs_auart_modem_status() argument
731 mctrl_diff = mctrl ^ s->mctrl_prev; in mxs_auart_modem_status()
732 s->mctrl_prev = mctrl; in mxs_auart_modem_status()
733 if (mctrl_diff & MCTRL_ANY_DELTA && s->ms_irq_enabled && in mxs_auart_modem_status()
734 s->port.state != NULL) { in mxs_auart_modem_status()
736 s->port.icount.rng++; in mxs_auart_modem_status()
738 s->port.icount.dsr++; in mxs_auart_modem_status()
740 uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD); in mxs_auart_modem_status()
742 uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS); in mxs_auart_modem_status()
744 wake_up_interruptible(&s->port.state->port.delta_msr_wait); in mxs_auart_modem_status()
751 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_get_mctrl() local
752 u32 stat = mxs_read(s, REG_STAT); in mxs_auart_get_mctrl()
758 return mctrl_gpio_get(s->gpios, &mctrl); in mxs_auart_get_mctrl()
766 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_enable_ms() local
771 if (s->ms_irq_enabled) in mxs_auart_enable_ms()
774 s->ms_irq_enabled = true; in mxs_auart_enable_ms()
776 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_enable_ms()
777 enable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_enable_ms()
780 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_enable_ms()
781 enable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_enable_ms()
783 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_enable_ms()
784 enable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_enable_ms()
786 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_enable_ms()
787 enable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_enable_ms()
795 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_disable_ms() local
800 if (!s->ms_irq_enabled) in mxs_auart_disable_ms()
803 s->ms_irq_enabled = false; in mxs_auart_disable_ms()
805 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_disable_ms()
806 disable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_disable_ms()
809 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_disable_ms()
810 disable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_disable_ms()
812 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_disable_ms()
813 disable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_disable_ms()
815 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_disable_ms()
816 disable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_disable_ms()
819 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
822 struct mxs_auart_port *s = (struct mxs_auart_port *) arg; in dma_rx_callback() local
823 struct tty_port *port = &s->port.state->port; in dma_rx_callback()
827 dma_unmap_sg(s->dev, &s->rx_sgl, 1, DMA_FROM_DEVICE); in dma_rx_callback()
829 stat = mxs_read(s, REG_STAT); in dma_rx_callback()
834 tty_insert_flip_string(port, s->rx_dma_buf, count); in dma_rx_callback()
836 mxs_write(stat, s, REG_STAT); in dma_rx_callback()
840 mxs_auart_dma_prep_rx(s); in dma_rx_callback()
843 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s) in mxs_auart_dma_prep_rx() argument
846 struct scatterlist *sgl = &s->rx_sgl; in mxs_auart_dma_prep_rx()
847 struct dma_chan *channel = s->rx_dma_chan; in mxs_auart_dma_prep_rx()
857 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_prep_rx()
862 sg_init_one(sgl, s->rx_dma_buf, UART_XMIT_SIZE); in mxs_auart_dma_prep_rx()
863 dma_map_sg(s->dev, sgl, 1, DMA_FROM_DEVICE); in mxs_auart_dma_prep_rx()
867 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_prep_rx()
873 desc->callback_param = s; in mxs_auart_dma_prep_rx()
879 static void mxs_auart_dma_exit_channel(struct mxs_auart_port *s) in mxs_auart_dma_exit_channel() argument
881 if (s->tx_dma_chan) { in mxs_auart_dma_exit_channel()
882 dma_release_channel(s->tx_dma_chan); in mxs_auart_dma_exit_channel()
883 s->tx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
885 if (s->rx_dma_chan) { in mxs_auart_dma_exit_channel()
886 dma_release_channel(s->rx_dma_chan); in mxs_auart_dma_exit_channel()
887 s->rx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
890 kfree(s->tx_dma_buf); in mxs_auart_dma_exit_channel()
891 kfree(s->rx_dma_buf); in mxs_auart_dma_exit_channel()
892 s->tx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
893 s->rx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
896 static void mxs_auart_dma_exit(struct mxs_auart_port *s) in mxs_auart_dma_exit() argument
900 s, REG_CTRL2); in mxs_auart_dma_exit()
902 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_exit()
903 s->flags &= ~MXS_AUART_DMA_ENABLED; in mxs_auart_dma_exit()
904 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_dma_exit()
905 clear_bit(MXS_AUART_DMA_RX_READY, &s->flags); in mxs_auart_dma_exit()
908 static int mxs_auart_dma_init(struct mxs_auart_port *s) in mxs_auart_dma_init() argument
910 if (auart_dma_enabled(s)) in mxs_auart_dma_init()
914 s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx"); in mxs_auart_dma_init()
915 if (!s->rx_dma_chan) in mxs_auart_dma_init()
917 s->rx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
918 if (!s->rx_dma_buf) in mxs_auart_dma_init()
922 s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx"); in mxs_auart_dma_init()
923 if (!s->tx_dma_chan) in mxs_auart_dma_init()
925 s->tx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
926 if (!s->tx_dma_buf) in mxs_auart_dma_init()
930 s->flags |= MXS_AUART_DMA_ENABLED; in mxs_auart_dma_init()
931 dev_dbg(s->dev, "enabled the DMA support."); in mxs_auart_dma_init()
934 s->port.fifosize = UART_XMIT_SIZE; in mxs_auart_dma_init()
939 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_init()
944 #define RTS_AT_AUART() !mctrl_gpio_to_gpiod(s->gpios, UART_GPIO_RTS)
945 #define CTS_AT_AUART() !mctrl_gpio_to_gpiod(s->gpios, UART_GPIO_CTS)
950 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_settermios() local
957 ctrl2 = mxs_read(s, REG_CTRL2); in mxs_auart_settermios()
1014 if (is_imx28_auart(s) in mxs_auart_settermios()
1015 && test_bit(MXS_AUART_RTSCTS, &s->flags)) { in mxs_auart_settermios()
1016 if (!mxs_auart_dma_init(s)) in mxs_auart_settermios()
1029 if (is_asm9260_auart(s)) { in mxs_auart_settermios()
1044 mxs_write(ctrl, s, REG_LINECTRL); in mxs_auart_settermios()
1046 mxs_write(ctrl2, s, REG_CTRL2); in mxs_auart_settermios()
1051 if (auart_dma_enabled(s) && in mxs_auart_settermios()
1052 !test_and_set_bit(MXS_AUART_DMA_RX_READY, &s->flags)) { in mxs_auart_settermios()
1053 if (!mxs_auart_dma_prep_rx(s)) { in mxs_auart_settermios()
1056 s, REG_INTR); in mxs_auart_settermios()
1058 mxs_auart_dma_exit(s); in mxs_auart_settermios()
1059 dev_err(s->dev, "We can not start up the DMA.\n"); in mxs_auart_settermios()
1084 struct mxs_auart_port *s = context; in mxs_auart_irq_handle() local
1085 u32 mctrl_temp = s->mctrl_prev; in mxs_auart_irq_handle()
1086 u32 stat = mxs_read(s, REG_STAT); in mxs_auart_irq_handle()
1088 istat = mxs_read(s, REG_INTR); in mxs_auart_irq_handle()
1092 | AUART_INTR_CTSMIS), s, REG_INTR); in mxs_auart_irq_handle()
1097 if (irq == s->gpio_irq[UART_GPIO_CTS] || in mxs_auart_irq_handle()
1098 irq == s->gpio_irq[UART_GPIO_DCD] || in mxs_auart_irq_handle()
1099 irq == s->gpio_irq[UART_GPIO_DSR] || in mxs_auart_irq_handle()
1100 irq == s->gpio_irq[UART_GPIO_RI]) in mxs_auart_irq_handle()
1101 mxs_auart_modem_status(s, in mxs_auart_irq_handle()
1102 mctrl_gpio_get(s->gpios, &mctrl_temp)); in mxs_auart_irq_handle()
1105 if (CTS_AT_AUART() && s->ms_irq_enabled) in mxs_auart_irq_handle()
1106 uart_handle_cts_change(&s->port, in mxs_auart_irq_handle()
1108 mxs_clr(AUART_INTR_CTSMIS, s, REG_INTR); in mxs_auart_irq_handle()
1113 if (!auart_dma_enabled(s)) in mxs_auart_irq_handle()
1114 mxs_auart_rx_chars(s); in mxs_auart_irq_handle()
1119 mxs_auart_tx_chars(s); in mxs_auart_irq_handle()
1126 static void mxs_auart_reset_deassert(struct mxs_auart_port *s) in mxs_auart_reset_deassert() argument
1131 mxs_clr(AUART_CTRL0_SFTRST, s, REG_CTRL0); in mxs_auart_reset_deassert()
1134 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_deassert()
1139 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_reset_deassert()
1142 static void mxs_auart_reset_assert(struct mxs_auart_port *s) in mxs_auart_reset_assert() argument
1147 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_assert()
1152 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_reset_assert()
1153 mxs_set(AUART_CTRL0_SFTRST, s, REG_CTRL0); in mxs_auart_reset_assert()
1156 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_assert()
1163 dev_err(s->dev, "Failed to reset the unit."); in mxs_auart_reset_assert()
1169 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_startup() local
1171 ret = clk_prepare_enable(s->clk); in mxs_auart_startup()
1176 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_startup()
1179 mxs_auart_reset_assert(s); in mxs_auart_startup()
1180 mxs_auart_reset_deassert(s); in mxs_auart_startup()
1183 mxs_set(AUART_CTRL2_UARTEN, s, REG_CTRL2); in mxs_auart_startup()
1186 s, REG_INTR); in mxs_auart_startup()
1195 mxs_set(AUART_LINECTRL_FEN, s, REG_LINECTRL); in mxs_auart_startup()
1198 mctrl_gpio_get(s->gpios, &s->mctrl_prev); in mxs_auart_startup()
1200 s->ms_irq_enabled = false; in mxs_auart_startup()
1206 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_shutdown() local
1210 if (auart_dma_enabled(s)) in mxs_auart_shutdown()
1211 mxs_auart_dma_exit(s); in mxs_auart_shutdown()
1214 mxs_clr(AUART_CTRL2_UARTEN, s, REG_CTRL2); in mxs_auart_shutdown()
1217 AUART_INTR_CTSMIEN, s, REG_INTR); in mxs_auart_shutdown()
1218 mxs_set(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_shutdown()
1220 mxs_auart_reset_assert(s); in mxs_auart_shutdown()
1223 clk_disable_unprepare(s->clk); in mxs_auart_shutdown()
1228 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_tx_empty() local
1230 if ((mxs_read(s, REG_STAT) & in mxs_auart_tx_empty()
1239 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_start_tx() local
1242 mxs_set(AUART_CTRL2_TXE, s, REG_CTRL2); in mxs_auart_start_tx()
1244 mxs_auart_tx_chars(s); in mxs_auart_start_tx()
1249 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_stop_tx() local
1251 mxs_clr(AUART_CTRL2_TXE, s, REG_CTRL2); in mxs_auart_stop_tx()
1256 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_stop_rx() local
1258 mxs_clr(AUART_CTRL2_RXE, s, REG_CTRL2); in mxs_auart_stop_rx()
1263 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_break_ctl() local
1266 mxs_set(AUART_LINECTRL_BRK, s, REG_LINECTRL); in mxs_auart_break_ctl()
1268 mxs_clr(AUART_LINECTRL_BRK, s, REG_LINECTRL); in mxs_auart_break_ctl()
1296 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_console_putchar() local
1299 while (mxs_read(s, REG_STAT) & AUART_STAT_TXFF) { in mxs_auart_console_putchar()
1305 mxs_write(ch, s, REG_DATA); in mxs_auart_console_putchar()
1311 struct mxs_auart_port *s; in auart_console_write() local
1319 s = auart_port[co->index]; in auart_console_write()
1320 port = &s->port; in auart_console_write()
1322 clk_enable(s->clk); in auart_console_write()
1325 old_ctrl2 = mxs_read(s, REG_CTRL2); in auart_console_write()
1326 old_ctrl0 = mxs_read(s, REG_CTRL0); in auart_console_write()
1328 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in auart_console_write()
1329 mxs_set(AUART_CTRL2_UARTEN | AUART_CTRL2_TXE, s, REG_CTRL2); in auart_console_write()
1334 while (mxs_read(s, REG_STAT) & AUART_STAT_BUSY) { in auart_console_write()
1346 if (!(mxs_read(s, REG_STAT) & AUART_STAT_BUSY)) { in auart_console_write()
1347 mxs_write(old_ctrl0, s, REG_CTRL0); in auart_console_write()
1348 mxs_write(old_ctrl2, s, REG_CTRL2); in auart_console_write()
1351 clk_disable(s->clk); in auart_console_write()
1355 auart_console_get_options(struct mxs_auart_port *s, int *baud, in auart_console_get_options() argument
1358 struct uart_port *port = &s->port; in auart_console_get_options()
1361 if (!(mxs_read(s, REG_CTRL2) & AUART_CTRL2_UARTEN)) in auart_console_get_options()
1364 lcr_h = mxs_read(s, REG_LINECTRL); in auart_console_get_options()
1379 quot = ((mxs_read(s, REG_LINECTRL) & AUART_LINECTRL_BAUD_DIVINT_MASK)) in auart_console_get_options()
1381 quot |= ((mxs_read(s, REG_LINECTRL) & AUART_LINECTRL_BAUD_DIVFRAC_MASK)) in auart_console_get_options()
1392 struct mxs_auart_port *s; in auart_console_setup() local
1406 s = auart_port[co->index]; in auart_console_setup()
1407 if (!s) in auart_console_setup()
1410 ret = clk_prepare_enable(s->clk); in auart_console_setup()
1417 auart_console_get_options(s, &baud, &parity, &bits); in auart_console_setup()
1419 ret = uart_set_options(&s->port, co, baud, parity, bits, flow); in auart_console_setup()
1421 clk_disable_unprepare(s->clk); in auart_console_setup()
1449 static void mxs_init_regs(struct mxs_auart_port *s) in mxs_init_regs() argument
1451 if (is_asm9260_auart(s)) in mxs_init_regs()
1452 s->vendor = &vendor_alphascale_asm9260; in mxs_init_regs()
1454 s->vendor = &vendor_freescale_stmp37xx; in mxs_init_regs()
1457 static int mxs_get_clks(struct mxs_auart_port *s, in mxs_get_clks() argument
1462 if (!is_asm9260_auart(s)) { in mxs_get_clks()
1463 s->clk = devm_clk_get(&pdev->dev, NULL); in mxs_get_clks()
1464 return PTR_ERR_OR_ZERO(s->clk); in mxs_get_clks()
1467 s->clk = devm_clk_get(s->dev, "mod"); in mxs_get_clks()
1468 if (IS_ERR(s->clk)) { in mxs_get_clks()
1469 dev_err(s->dev, "Failed to get \"mod\" clk\n"); in mxs_get_clks()
1470 return PTR_ERR(s->clk); in mxs_get_clks()
1473 s->clk_ahb = devm_clk_get(s->dev, "ahb"); in mxs_get_clks()
1474 if (IS_ERR(s->clk_ahb)) { in mxs_get_clks()
1475 dev_err(s->dev, "Failed to get \"ahb\" clk\n"); in mxs_get_clks()
1476 return PTR_ERR(s->clk_ahb); in mxs_get_clks()
1479 err = clk_prepare_enable(s->clk_ahb); in mxs_get_clks()
1481 dev_err(s->dev, "Failed to enable ahb_clk!\n"); in mxs_get_clks()
1485 err = clk_set_rate(s->clk, clk_get_rate(s->clk_ahb)); in mxs_get_clks()
1487 dev_err(s->dev, "Failed to set rate!\n"); in mxs_get_clks()
1491 err = clk_prepare_enable(s->clk); in mxs_get_clks()
1493 dev_err(s->dev, "Failed to enable clk!\n"); in mxs_get_clks()
1500 clk_disable_unprepare(s->clk_ahb); in mxs_get_clks()
1504 static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) in mxs_auart_init_gpios() argument
1509 s->gpios = mctrl_gpio_init_noauto(dev, 0); in mxs_auart_init_gpios()
1510 if (IS_ERR(s->gpios)) in mxs_auart_init_gpios()
1511 return PTR_ERR(s->gpios); in mxs_auart_init_gpios()
1515 if (test_bit(MXS_AUART_RTSCTS, &s->flags)) in mxs_auart_init_gpios()
1518 clear_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_init_gpios()
1522 gpiod = mctrl_gpio_to_gpiod(s->gpios, i); in mxs_auart_init_gpios()
1524 s->gpio_irq[i] = gpiod_to_irq(gpiod); in mxs_auart_init_gpios()
1526 s->gpio_irq[i] = -EINVAL; in mxs_auart_init_gpios()
1532 static void mxs_auart_free_gpio_irq(struct mxs_auart_port *s) in mxs_auart_free_gpio_irq() argument
1537 if (s->gpio_irq[i] >= 0) in mxs_auart_free_gpio_irq()
1538 free_irq(s->gpio_irq[i], s); in mxs_auart_free_gpio_irq()
1541 static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) in mxs_auart_request_gpio_irq() argument
1543 int *irq = s->gpio_irq; in mxs_auart_request_gpio_irq()
1553 IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); in mxs_auart_request_gpio_irq()
1555 dev_err(s->dev, "%s - Can't get %d irq\n", in mxs_auart_request_gpio_irq()
1565 free_irq(irq[i], s); in mxs_auart_request_gpio_irq()
1573 struct mxs_auart_port *s; in mxs_auart_probe() local
1578 s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); in mxs_auart_probe()
1579 if (!s) in mxs_auart_probe()
1582 s->port.dev = &pdev->dev; in mxs_auart_probe()
1583 s->dev = &pdev->dev; in mxs_auart_probe()
1590 s->port.line = ret; in mxs_auart_probe()
1594 set_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_probe()
1596 if (s->port.line >= ARRAY_SIZE(auart_port)) { in mxs_auart_probe()
1597 dev_err(&pdev->dev, "serial%d out of range\n", s->port.line); in mxs_auart_probe()
1601 s->devtype = (enum mxs_auart_type)of_device_get_match_data(&pdev->dev); in mxs_auart_probe()
1603 ret = mxs_get_clks(s, pdev); in mxs_auart_probe()
1613 s->port.mapbase = r->start; in mxs_auart_probe()
1614 s->port.membase = ioremap(r->start, resource_size(r)); in mxs_auart_probe()
1615 if (!s->port.membase) { in mxs_auart_probe()
1619 s->port.ops = &mxs_auart_ops; in mxs_auart_probe()
1620 s->port.iotype = UPIO_MEM; in mxs_auart_probe()
1621 s->port.fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_probe()
1622 s->port.uartclk = clk_get_rate(s->clk); in mxs_auart_probe()
1623 s->port.type = PORT_IMX; in mxs_auart_probe()
1624 s->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_MXS_AUART_CONSOLE); in mxs_auart_probe()
1626 mxs_init_regs(s); in mxs_auart_probe()
1628 s->mctrl_prev = 0; in mxs_auart_probe()
1636 s->port.irq = irq; in mxs_auart_probe()
1638 dev_name(&pdev->dev), s); in mxs_auart_probe()
1642 platform_set_drvdata(pdev, s); in mxs_auart_probe()
1644 ret = mxs_auart_init_gpios(s, &pdev->dev); in mxs_auart_probe()
1653 ret = mxs_auart_request_gpio_irq(s); in mxs_auart_probe()
1657 auart_port[s->port.line] = s; in mxs_auart_probe()
1659 mxs_auart_reset_deassert(s); in mxs_auart_probe()
1661 ret = uart_add_one_port(&auart_driver, &s->port); in mxs_auart_probe()
1666 if (is_asm9260_auart(s)) { in mxs_auart_probe()
1669 version = mxs_read(s, REG_VERSION); in mxs_auart_probe()
1678 mxs_auart_free_gpio_irq(s); in mxs_auart_probe()
1682 iounmap(s->port.membase); in mxs_auart_probe()
1685 if (is_asm9260_auart(s)) { in mxs_auart_probe()
1686 clk_disable_unprepare(s->clk); in mxs_auart_probe()
1687 clk_disable_unprepare(s->clk_ahb); in mxs_auart_probe()
1694 struct mxs_auart_port *s = platform_get_drvdata(pdev); in mxs_auart_remove() local
1696 uart_remove_one_port(&auart_driver, &s->port); in mxs_auart_remove()
1698 mxs_auart_free_gpio_irq(s); in mxs_auart_remove()
1699 iounmap(s->port.membase); in mxs_auart_remove()
1700 if (is_asm9260_auart(s)) { in mxs_auart_remove()
1701 clk_disable_unprepare(s->clk); in mxs_auart_remove()
1702 clk_disable_unprepare(s->clk_ahb); in mxs_auart_remove()