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()
573 if (auart_dma_enabled(s)) { in mxs_auart_tx_chars()
576 void *buffer = s->tx_dma_buf; in mxs_auart_tx_chars()
578 if (test_and_set_bit(MXS_AUART_DMA_TX_SYNC, &s->flags)) in mxs_auart_tx_chars()
581 while (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
594 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
595 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
598 mxs_auart_dma_tx(s, i); in mxs_auart_tx_chars()
600 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_tx_chars()
607 while (!(mxs_read(s, REG_STAT) & AUART_STAT_TXFF)) { in mxs_auart_tx_chars()
608 if (s->port.x_char) { in mxs_auart_tx_chars()
609 s->port.icount.tx++; in mxs_auart_tx_chars()
610 mxs_write(s->port.x_char, s, REG_DATA); in mxs_auart_tx_chars()
611 s->port.x_char = 0; in mxs_auart_tx_chars()
614 if (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
615 s->port.icount.tx++; in mxs_auart_tx_chars()
616 mxs_write(xmit->buf[xmit->tail], s, REG_DATA); in mxs_auart_tx_chars()
622 uart_write_wakeup(&s->port); in mxs_auart_tx_chars()
624 if (uart_circ_empty(&(s->port.state->xmit))) in mxs_auart_tx_chars()
625 mxs_clr(AUART_INTR_TXIEN, s, REG_INTR); in mxs_auart_tx_chars()
627 mxs_set(AUART_INTR_TXIEN, s, REG_INTR); in mxs_auart_tx_chars()
629 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
630 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
633 static void mxs_auart_rx_char(struct mxs_auart_port *s) in mxs_auart_rx_char() argument
639 c = mxs_read(s, REG_DATA); in mxs_auart_rx_char()
640 stat = mxs_read(s, REG_STAT); in mxs_auart_rx_char()
643 s->port.icount.rx++; in mxs_auart_rx_char()
646 s->port.icount.brk++; in mxs_auart_rx_char()
647 if (uart_handle_break(&s->port)) in mxs_auart_rx_char()
650 s->port.icount.parity++; in mxs_auart_rx_char()
652 s->port.icount.frame++; in mxs_auart_rx_char()
658 stat &= s->port.read_status_mask; in mxs_auart_rx_char()
668 s->port.icount.overrun++; in mxs_auart_rx_char()
670 if (uart_handle_sysrq_char(&s->port, c)) in mxs_auart_rx_char()
673 uart_insert_char(&s->port, stat, AUART_STAT_OERR, c, flag); in mxs_auart_rx_char()
675 mxs_write(stat, s, REG_STAT); in mxs_auart_rx_char()
678 static void mxs_auart_rx_chars(struct mxs_auart_port *s) in mxs_auart_rx_chars() argument
683 stat = mxs_read(s, REG_STAT); in mxs_auart_rx_chars()
686 mxs_auart_rx_char(s); in mxs_auart_rx_chars()
689 mxs_write(stat, s, REG_STAT); in mxs_auart_rx_chars()
690 tty_flip_buffer_push(&s->port.state->port); in mxs_auart_rx_chars()
712 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_type() local
714 return dev_name(s->dev); in mxs_auart_type()
723 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_set_mctrl() local
725 u32 ctrl = mxs_read(s, REG_CTRL2); in mxs_auart_set_mctrl()
735 mxs_write(ctrl, s, REG_CTRL2); in mxs_auart_set_mctrl()
737 mctrl_gpio_set(s->gpios, mctrl); in mxs_auart_set_mctrl()
741 static u32 mxs_auart_modem_status(struct mxs_auart_port *s, u32 mctrl) in mxs_auart_modem_status() argument
745 mctrl_diff = mctrl ^ s->mctrl_prev; in mxs_auart_modem_status()
746 s->mctrl_prev = mctrl; in mxs_auart_modem_status()
747 if (mctrl_diff & MCTRL_ANY_DELTA && s->ms_irq_enabled && in mxs_auart_modem_status()
748 s->port.state != NULL) { in mxs_auart_modem_status()
750 s->port.icount.rng++; in mxs_auart_modem_status()
752 s->port.icount.dsr++; in mxs_auart_modem_status()
754 uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD); in mxs_auart_modem_status()
756 uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS); in mxs_auart_modem_status()
758 wake_up_interruptible(&s->port.state->port.delta_msr_wait); in mxs_auart_modem_status()
765 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_get_mctrl() local
766 u32 stat = mxs_read(s, REG_STAT); in mxs_auart_get_mctrl()
772 return mctrl_gpio_get(s->gpios, &mctrl); in mxs_auart_get_mctrl()
780 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_enable_ms() local
785 if (s->ms_irq_enabled) in mxs_auart_enable_ms()
788 s->ms_irq_enabled = true; in mxs_auart_enable_ms()
790 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_enable_ms()
791 enable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_enable_ms()
794 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_enable_ms()
795 enable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_enable_ms()
797 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_enable_ms()
798 enable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_enable_ms()
800 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_enable_ms()
801 enable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_enable_ms()
809 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_disable_ms() local
814 if (!s->ms_irq_enabled) in mxs_auart_disable_ms()
817 s->ms_irq_enabled = false; in mxs_auart_disable_ms()
819 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_disable_ms()
820 disable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_disable_ms()
823 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_disable_ms()
824 disable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_disable_ms()
826 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_disable_ms()
827 disable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_disable_ms()
829 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_disable_ms()
830 disable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_disable_ms()
833 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
836 struct mxs_auart_port *s = (struct mxs_auart_port *) arg; in dma_rx_callback() local
837 struct tty_port *port = &s->port.state->port; in dma_rx_callback()
841 dma_unmap_sg(s->dev, &s->rx_sgl, 1, DMA_FROM_DEVICE); in dma_rx_callback()
843 stat = mxs_read(s, REG_STAT); in dma_rx_callback()
848 tty_insert_flip_string(port, s->rx_dma_buf, count); in dma_rx_callback()
850 mxs_write(stat, s, REG_STAT); in dma_rx_callback()
854 mxs_auart_dma_prep_rx(s); in dma_rx_callback()
857 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s) in mxs_auart_dma_prep_rx() argument
860 struct scatterlist *sgl = &s->rx_sgl; in mxs_auart_dma_prep_rx()
861 struct dma_chan *channel = s->rx_dma_chan; in mxs_auart_dma_prep_rx()
871 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_prep_rx()
876 sg_init_one(sgl, s->rx_dma_buf, UART_XMIT_SIZE); in mxs_auart_dma_prep_rx()
877 dma_map_sg(s->dev, sgl, 1, DMA_FROM_DEVICE); in mxs_auart_dma_prep_rx()
881 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_prep_rx()
887 desc->callback_param = s; in mxs_auart_dma_prep_rx()
893 static void mxs_auart_dma_exit_channel(struct mxs_auart_port *s) in mxs_auart_dma_exit_channel() argument
895 if (s->tx_dma_chan) { in mxs_auart_dma_exit_channel()
896 dma_release_channel(s->tx_dma_chan); in mxs_auart_dma_exit_channel()
897 s->tx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
899 if (s->rx_dma_chan) { in mxs_auart_dma_exit_channel()
900 dma_release_channel(s->rx_dma_chan); in mxs_auart_dma_exit_channel()
901 s->rx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
904 kfree(s->tx_dma_buf); in mxs_auart_dma_exit_channel()
905 kfree(s->rx_dma_buf); in mxs_auart_dma_exit_channel()
906 s->tx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
907 s->rx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
910 static void mxs_auart_dma_exit(struct mxs_auart_port *s) in mxs_auart_dma_exit() argument
914 s, REG_CTRL2); in mxs_auart_dma_exit()
916 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_exit()
917 s->flags &= ~MXS_AUART_DMA_ENABLED; in mxs_auart_dma_exit()
918 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_dma_exit()
919 clear_bit(MXS_AUART_DMA_RX_READY, &s->flags); in mxs_auart_dma_exit()
922 static int mxs_auart_dma_init(struct mxs_auart_port *s) in mxs_auart_dma_init() argument
924 if (auart_dma_enabled(s)) in mxs_auart_dma_init()
928 s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx"); in mxs_auart_dma_init()
929 if (!s->rx_dma_chan) in mxs_auart_dma_init()
931 s->rx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
932 if (!s->rx_dma_buf) in mxs_auart_dma_init()
936 s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx"); in mxs_auart_dma_init()
937 if (!s->tx_dma_chan) in mxs_auart_dma_init()
939 s->tx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
940 if (!s->tx_dma_buf) in mxs_auart_dma_init()
944 s->flags |= MXS_AUART_DMA_ENABLED; in mxs_auart_dma_init()
945 dev_dbg(s->dev, "enabled the DMA support."); in mxs_auart_dma_init()
948 s->port.fifosize = UART_XMIT_SIZE; in mxs_auart_dma_init()
953 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_init()
958 #define RTS_AT_AUART() !mctrl_gpio_to_gpiod(s->gpios, UART_GPIO_RTS)
959 #define CTS_AT_AUART() !mctrl_gpio_to_gpiod(s->gpios, UART_GPIO_CTS)
964 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_settermios() local
971 ctrl2 = mxs_read(s, REG_CTRL2); in mxs_auart_settermios()
1028 if (is_imx28_auart(s) in mxs_auart_settermios()
1029 && test_bit(MXS_AUART_RTSCTS, &s->flags)) { in mxs_auart_settermios()
1030 if (!mxs_auart_dma_init(s)) in mxs_auart_settermios()
1043 if (is_asm9260_auart(s)) { in mxs_auart_settermios()
1058 mxs_write(ctrl, s, REG_LINECTRL); in mxs_auart_settermios()
1060 mxs_write(ctrl2, s, REG_CTRL2); in mxs_auart_settermios()
1065 if (auart_dma_enabled(s) && in mxs_auart_settermios()
1066 !test_and_set_bit(MXS_AUART_DMA_RX_READY, &s->flags)) { in mxs_auart_settermios()
1067 if (!mxs_auart_dma_prep_rx(s)) { in mxs_auart_settermios()
1070 s, REG_INTR); in mxs_auart_settermios()
1072 mxs_auart_dma_exit(s); in mxs_auart_settermios()
1073 dev_err(s->dev, "We can not start up the DMA.\n"); in mxs_auart_settermios()
1098 struct mxs_auart_port *s = context; in mxs_auart_irq_handle() local
1099 u32 mctrl_temp = s->mctrl_prev; in mxs_auart_irq_handle()
1100 u32 stat = mxs_read(s, REG_STAT); in mxs_auart_irq_handle()
1102 istat = mxs_read(s, REG_INTR); in mxs_auart_irq_handle()
1106 | AUART_INTR_CTSMIS), s, REG_INTR); in mxs_auart_irq_handle()
1111 if (irq == s->gpio_irq[UART_GPIO_CTS] || in mxs_auart_irq_handle()
1112 irq == s->gpio_irq[UART_GPIO_DCD] || in mxs_auart_irq_handle()
1113 irq == s->gpio_irq[UART_GPIO_DSR] || in mxs_auart_irq_handle()
1114 irq == s->gpio_irq[UART_GPIO_RI]) in mxs_auart_irq_handle()
1115 mxs_auart_modem_status(s, in mxs_auart_irq_handle()
1116 mctrl_gpio_get(s->gpios, &mctrl_temp)); in mxs_auart_irq_handle()
1119 if (CTS_AT_AUART() && s->ms_irq_enabled) in mxs_auart_irq_handle()
1120 uart_handle_cts_change(&s->port, in mxs_auart_irq_handle()
1122 mxs_clr(AUART_INTR_CTSMIS, s, REG_INTR); in mxs_auart_irq_handle()
1127 if (!auart_dma_enabled(s)) in mxs_auart_irq_handle()
1128 mxs_auart_rx_chars(s); in mxs_auart_irq_handle()
1133 mxs_auart_tx_chars(s); in mxs_auart_irq_handle()
1140 static void mxs_auart_reset_deassert(struct mxs_auart_port *s) in mxs_auart_reset_deassert() argument
1145 mxs_clr(AUART_CTRL0_SFTRST, s, REG_CTRL0); in mxs_auart_reset_deassert()
1148 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_deassert()
1153 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_reset_deassert()
1156 static void mxs_auart_reset_assert(struct mxs_auart_port *s) in mxs_auart_reset_assert() argument
1161 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_assert()
1166 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_reset_assert()
1167 mxs_set(AUART_CTRL0_SFTRST, s, REG_CTRL0); in mxs_auart_reset_assert()
1170 reg = mxs_read(s, REG_CTRL0); in mxs_auart_reset_assert()
1177 dev_err(s->dev, "Failed to reset the unit."); in mxs_auart_reset_assert()
1183 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_startup() local
1185 ret = clk_prepare_enable(s->clk); in mxs_auart_startup()
1190 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_startup()
1193 mxs_auart_reset_assert(s); in mxs_auart_startup()
1194 mxs_auart_reset_deassert(s); in mxs_auart_startup()
1197 mxs_set(AUART_CTRL2_UARTEN, s, REG_CTRL2); in mxs_auart_startup()
1200 s, REG_INTR); in mxs_auart_startup()
1209 mxs_set(AUART_LINECTRL_FEN, s, REG_LINECTRL); in mxs_auart_startup()
1212 mctrl_gpio_get(s->gpios, &s->mctrl_prev); in mxs_auart_startup()
1214 s->ms_irq_enabled = false; in mxs_auart_startup()
1220 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_shutdown() local
1224 if (auart_dma_enabled(s)) in mxs_auart_shutdown()
1225 mxs_auart_dma_exit(s); in mxs_auart_shutdown()
1228 mxs_clr(AUART_CTRL2_UARTEN, s, REG_CTRL2); in mxs_auart_shutdown()
1231 AUART_INTR_CTSMIEN, s, REG_INTR); in mxs_auart_shutdown()
1232 mxs_set(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in mxs_auart_shutdown()
1234 mxs_auart_reset_assert(s); in mxs_auart_shutdown()
1237 clk_disable_unprepare(s->clk); in mxs_auart_shutdown()
1242 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_tx_empty() local
1244 if ((mxs_read(s, REG_STAT) & in mxs_auart_tx_empty()
1253 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_start_tx() local
1256 mxs_set(AUART_CTRL2_TXE, s, REG_CTRL2); in mxs_auart_start_tx()
1258 mxs_auart_tx_chars(s); in mxs_auart_start_tx()
1263 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_stop_tx() local
1265 mxs_clr(AUART_CTRL2_TXE, s, REG_CTRL2); in mxs_auart_stop_tx()
1270 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_stop_rx() local
1272 mxs_clr(AUART_CTRL2_RXE, s, REG_CTRL2); in mxs_auart_stop_rx()
1277 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_break_ctl() local
1280 mxs_set(AUART_LINECTRL_BRK, s, REG_LINECTRL); in mxs_auart_break_ctl()
1282 mxs_clr(AUART_LINECTRL_BRK, s, REG_LINECTRL); in mxs_auart_break_ctl()
1310 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_console_putchar() local
1313 while (mxs_read(s, REG_STAT) & AUART_STAT_TXFF) { in mxs_auart_console_putchar()
1319 mxs_write(ch, s, REG_DATA); in mxs_auart_console_putchar()
1325 struct mxs_auart_port *s; in auart_console_write() local
1333 s = auart_port[co->index]; in auart_console_write()
1334 port = &s->port; in auart_console_write()
1336 clk_enable(s->clk); in auart_console_write()
1339 old_ctrl2 = mxs_read(s, REG_CTRL2); in auart_console_write()
1340 old_ctrl0 = mxs_read(s, REG_CTRL0); in auart_console_write()
1342 mxs_clr(AUART_CTRL0_CLKGATE, s, REG_CTRL0); in auart_console_write()
1343 mxs_set(AUART_CTRL2_UARTEN | AUART_CTRL2_TXE, s, REG_CTRL2); in auart_console_write()
1348 while (mxs_read(s, REG_STAT) & AUART_STAT_BUSY) { in auart_console_write()
1360 if (!(mxs_read(s, REG_STAT) & AUART_STAT_BUSY)) { in auart_console_write()
1361 mxs_write(old_ctrl0, s, REG_CTRL0); in auart_console_write()
1362 mxs_write(old_ctrl2, s, REG_CTRL2); in auart_console_write()
1365 clk_disable(s->clk); in auart_console_write()
1369 auart_console_get_options(struct mxs_auart_port *s, int *baud, in auart_console_get_options() argument
1372 struct uart_port *port = &s->port; in auart_console_get_options()
1375 if (!(mxs_read(s, REG_CTRL2) & AUART_CTRL2_UARTEN)) in auart_console_get_options()
1378 lcr_h = mxs_read(s, REG_LINECTRL); in auart_console_get_options()
1393 quot = ((mxs_read(s, REG_LINECTRL) & AUART_LINECTRL_BAUD_DIVINT_MASK)) in auart_console_get_options()
1395 quot |= ((mxs_read(s, REG_LINECTRL) & AUART_LINECTRL_BAUD_DIVFRAC_MASK)) in auart_console_get_options()
1406 struct mxs_auart_port *s; in auart_console_setup() local
1420 s = auart_port[co->index]; in auart_console_setup()
1421 if (!s) in auart_console_setup()
1424 ret = clk_prepare_enable(s->clk); in auart_console_setup()
1431 auart_console_get_options(s, &baud, &parity, &bits); in auart_console_setup()
1433 ret = uart_set_options(&s->port, co, baud, parity, bits, flow); in auart_console_setup()
1435 clk_disable_unprepare(s->clk); in auart_console_setup()
1463 static void mxs_init_regs(struct mxs_auart_port *s) in mxs_init_regs() argument
1465 if (is_asm9260_auart(s)) in mxs_init_regs()
1466 s->vendor = &vendor_alphascale_asm9260; in mxs_init_regs()
1468 s->vendor = &vendor_freescale_stmp37xx; in mxs_init_regs()
1471 static int mxs_get_clks(struct mxs_auart_port *s, in mxs_get_clks() argument
1476 if (!is_asm9260_auart(s)) { in mxs_get_clks()
1477 s->clk = devm_clk_get(&pdev->dev, NULL); in mxs_get_clks()
1478 return PTR_ERR_OR_ZERO(s->clk); in mxs_get_clks()
1481 s->clk = devm_clk_get(s->dev, "mod"); in mxs_get_clks()
1482 if (IS_ERR(s->clk)) { in mxs_get_clks()
1483 dev_err(s->dev, "Failed to get \"mod\" clk\n"); in mxs_get_clks()
1484 return PTR_ERR(s->clk); in mxs_get_clks()
1487 s->clk_ahb = devm_clk_get(s->dev, "ahb"); in mxs_get_clks()
1488 if (IS_ERR(s->clk_ahb)) { in mxs_get_clks()
1489 dev_err(s->dev, "Failed to get \"ahb\" clk\n"); in mxs_get_clks()
1490 return PTR_ERR(s->clk_ahb); in mxs_get_clks()
1493 err = clk_prepare_enable(s->clk_ahb); in mxs_get_clks()
1495 dev_err(s->dev, "Failed to enable ahb_clk!\n"); in mxs_get_clks()
1499 err = clk_set_rate(s->clk, clk_get_rate(s->clk_ahb)); in mxs_get_clks()
1501 dev_err(s->dev, "Failed to set rate!\n"); in mxs_get_clks()
1505 err = clk_prepare_enable(s->clk); in mxs_get_clks()
1507 dev_err(s->dev, "Failed to enable clk!\n"); in mxs_get_clks()
1514 clk_disable_unprepare(s->clk_ahb); in mxs_get_clks()
1518 static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) in mxs_auart_init_gpios() argument
1523 s->gpios = mctrl_gpio_init_noauto(dev, 0); in mxs_auart_init_gpios()
1524 if (IS_ERR(s->gpios)) in mxs_auart_init_gpios()
1525 return PTR_ERR(s->gpios); in mxs_auart_init_gpios()
1529 if (test_bit(MXS_AUART_RTSCTS, &s->flags)) in mxs_auart_init_gpios()
1532 clear_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_init_gpios()
1536 gpiod = mctrl_gpio_to_gpiod(s->gpios, i); in mxs_auart_init_gpios()
1538 s->gpio_irq[i] = gpiod_to_irq(gpiod); in mxs_auart_init_gpios()
1540 s->gpio_irq[i] = -EINVAL; in mxs_auart_init_gpios()
1546 static void mxs_auart_free_gpio_irq(struct mxs_auart_port *s) in mxs_auart_free_gpio_irq() argument
1551 if (s->gpio_irq[i] >= 0) in mxs_auart_free_gpio_irq()
1552 free_irq(s->gpio_irq[i], s); in mxs_auart_free_gpio_irq()
1555 static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) in mxs_auart_request_gpio_irq() argument
1557 int *irq = s->gpio_irq; in mxs_auart_request_gpio_irq()
1567 IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); in mxs_auart_request_gpio_irq()
1569 dev_err(s->dev, "%s - Can't get %d irq\n", in mxs_auart_request_gpio_irq()
1579 free_irq(irq[i], s); in mxs_auart_request_gpio_irq()
1587 struct mxs_auart_port *s; in mxs_auart_probe() local
1592 s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); in mxs_auart_probe()
1593 if (!s) in mxs_auart_probe()
1596 s->port.dev = &pdev->dev; in mxs_auart_probe()
1597 s->dev = &pdev->dev; in mxs_auart_probe()
1604 s->port.line = ret; in mxs_auart_probe()
1608 set_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_probe()
1610 if (s->port.line >= ARRAY_SIZE(auart_port)) { in mxs_auart_probe()
1611 dev_err(&pdev->dev, "serial%d out of range\n", s->port.line); in mxs_auart_probe()
1615 s->devtype = (enum mxs_auart_type)of_device_get_match_data(&pdev->dev); in mxs_auart_probe()
1617 ret = mxs_get_clks(s, pdev); in mxs_auart_probe()
1627 s->port.mapbase = r->start; in mxs_auart_probe()
1628 s->port.membase = ioremap(r->start, resource_size(r)); in mxs_auart_probe()
1629 if (!s->port.membase) { in mxs_auart_probe()
1633 s->port.ops = &mxs_auart_ops; in mxs_auart_probe()
1634 s->port.iotype = UPIO_MEM; in mxs_auart_probe()
1635 s->port.fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_probe()
1636 s->port.uartclk = clk_get_rate(s->clk); in mxs_auart_probe()
1637 s->port.type = PORT_IMX; in mxs_auart_probe()
1638 s->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_MXS_AUART_CONSOLE); in mxs_auart_probe()
1640 mxs_init_regs(s); in mxs_auart_probe()
1642 s->mctrl_prev = 0; in mxs_auart_probe()
1650 s->port.irq = irq; in mxs_auart_probe()
1652 dev_name(&pdev->dev), s); in mxs_auart_probe()
1656 platform_set_drvdata(pdev, s); in mxs_auart_probe()
1658 ret = mxs_auart_init_gpios(s, &pdev->dev); in mxs_auart_probe()
1667 ret = mxs_auart_request_gpio_irq(s); in mxs_auart_probe()
1671 auart_port[s->port.line] = s; in mxs_auart_probe()
1673 mxs_auart_reset_deassert(s); in mxs_auart_probe()
1675 ret = uart_add_one_port(&auart_driver, &s->port); in mxs_auart_probe()
1680 if (is_asm9260_auart(s)) { in mxs_auart_probe()
1683 version = mxs_read(s, REG_VERSION); in mxs_auart_probe()
1692 mxs_auart_free_gpio_irq(s); in mxs_auart_probe()
1696 iounmap(s->port.membase); in mxs_auart_probe()
1699 if (is_asm9260_auart(s)) { in mxs_auart_probe()
1700 clk_disable_unprepare(s->clk); in mxs_auart_probe()
1701 clk_disable_unprepare(s->clk_ahb); in mxs_auart_probe()
1708 struct mxs_auart_port *s = platform_get_drvdata(pdev); in mxs_auart_remove() local
1710 uart_remove_one_port(&auart_driver, &s->port); in mxs_auart_remove()
1712 mxs_auart_free_gpio_irq(s); in mxs_auart_remove()
1713 iounmap(s->port.membase); in mxs_auart_remove()
1714 if (is_asm9260_auart(s)) { in mxs_auart_remove()
1715 clk_disable_unprepare(s->clk); in mxs_auart_remove()
1716 clk_disable_unprepare(s->clk_ahb); in mxs_auart_remove()