Lines Matching refs:s
192 static inline int is_imx28_auart(struct mxs_auart_port *s) in is_imx28_auart() argument
194 return s->devtype == IMX28_AUART; in is_imx28_auart()
197 static inline bool auart_dma_enabled(struct mxs_auart_port *s) in auart_dma_enabled() argument
199 return s->flags & MXS_AUART_DMA_ENABLED; in auart_dma_enabled()
206 static void mxs_auart_tx_chars(struct mxs_auart_port *s);
210 struct mxs_auart_port *s = param; in dma_tx_callback() local
211 struct circ_buf *xmit = &s->port.state->xmit; in dma_tx_callback()
213 dma_unmap_sg(s->dev, &s->tx_sgl, 1, DMA_TO_DEVICE); in dma_tx_callback()
216 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in dma_tx_callback()
221 uart_write_wakeup(&s->port); in dma_tx_callback()
223 mxs_auart_tx_chars(s); in dma_tx_callback()
226 static int mxs_auart_dma_tx(struct mxs_auart_port *s, int size) in mxs_auart_dma_tx() argument
229 struct scatterlist *sgl = &s->tx_sgl; in mxs_auart_dma_tx()
230 struct dma_chan *channel = s->tx_dma_chan; in mxs_auart_dma_tx()
238 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_tx()
243 sg_init_one(sgl, s->tx_dma_buf, size); in mxs_auart_dma_tx()
244 dma_map_sg(s->dev, sgl, 1, DMA_TO_DEVICE); in mxs_auart_dma_tx()
248 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_tx()
254 desc->callback_param = s; in mxs_auart_dma_tx()
260 static void mxs_auart_tx_chars(struct mxs_auart_port *s) in mxs_auart_tx_chars() argument
262 struct circ_buf *xmit = &s->port.state->xmit; in mxs_auart_tx_chars()
264 if (auart_dma_enabled(s)) { in mxs_auart_tx_chars()
267 void *buffer = s->tx_dma_buf; in mxs_auart_tx_chars()
269 if (test_and_set_bit(MXS_AUART_DMA_TX_SYNC, &s->flags)) in mxs_auart_tx_chars()
272 while (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
285 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
286 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
289 mxs_auart_dma_tx(s, i); in mxs_auart_tx_chars()
291 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_tx_chars()
298 while (!(readl(s->port.membase + AUART_STAT) & in mxs_auart_tx_chars()
300 if (s->port.x_char) { in mxs_auart_tx_chars()
301 s->port.icount.tx++; in mxs_auart_tx_chars()
302 writel(s->port.x_char, in mxs_auart_tx_chars()
303 s->port.membase + AUART_DATA); in mxs_auart_tx_chars()
304 s->port.x_char = 0; in mxs_auart_tx_chars()
307 if (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
308 s->port.icount.tx++; in mxs_auart_tx_chars()
310 s->port.membase + AUART_DATA); in mxs_auart_tx_chars()
316 uart_write_wakeup(&s->port); in mxs_auart_tx_chars()
318 if (uart_circ_empty(&(s->port.state->xmit))) in mxs_auart_tx_chars()
320 s->port.membase + AUART_INTR_CLR); in mxs_auart_tx_chars()
323 s->port.membase + AUART_INTR_SET); in mxs_auart_tx_chars()
325 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
326 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
329 static void mxs_auart_rx_char(struct mxs_auart_port *s) in mxs_auart_rx_char() argument
335 c = readl(s->port.membase + AUART_DATA); in mxs_auart_rx_char()
336 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_rx_char()
339 s->port.icount.rx++; in mxs_auart_rx_char()
342 s->port.icount.brk++; in mxs_auart_rx_char()
343 if (uart_handle_break(&s->port)) in mxs_auart_rx_char()
346 s->port.icount.parity++; in mxs_auart_rx_char()
348 s->port.icount.frame++; in mxs_auart_rx_char()
354 stat &= s->port.read_status_mask; in mxs_auart_rx_char()
364 s->port.icount.overrun++; in mxs_auart_rx_char()
366 if (uart_handle_sysrq_char(&s->port, c)) in mxs_auart_rx_char()
369 uart_insert_char(&s->port, stat, AUART_STAT_OERR, c, flag); in mxs_auart_rx_char()
371 writel(stat, s->port.membase + AUART_STAT); in mxs_auart_rx_char()
374 static void mxs_auart_rx_chars(struct mxs_auart_port *s) in mxs_auart_rx_chars() argument
379 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_rx_chars()
382 mxs_auart_rx_char(s); in mxs_auart_rx_chars()
385 writel(stat, s->port.membase + AUART_STAT); in mxs_auart_rx_chars()
386 tty_flip_buffer_push(&s->port.state->port); in mxs_auart_rx_chars()
408 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_type() local
410 return dev_name(s->dev); in mxs_auart_type()
419 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_set_mctrl() local
433 mctrl_gpio_set(s->gpios, mctrl); in mxs_auart_set_mctrl()
437 static u32 mxs_auart_modem_status(struct mxs_auart_port *s, u32 mctrl) in mxs_auart_modem_status() argument
441 mctrl_diff = mctrl ^ s->mctrl_prev; in mxs_auart_modem_status()
442 s->mctrl_prev = mctrl; in mxs_auart_modem_status()
443 if (mctrl_diff & MCTRL_ANY_DELTA && s->ms_irq_enabled && in mxs_auart_modem_status()
444 s->port.state != NULL) { in mxs_auart_modem_status()
446 s->port.icount.rng++; in mxs_auart_modem_status()
448 s->port.icount.dsr++; in mxs_auart_modem_status()
450 uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD); in mxs_auart_modem_status()
452 uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS); in mxs_auart_modem_status()
454 wake_up_interruptible(&s->port.state->port.delta_msr_wait); in mxs_auart_modem_status()
461 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_get_mctrl() local
468 return mctrl_gpio_get(s->gpios, &mctrl); in mxs_auart_get_mctrl()
476 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_enable_ms() local
481 if (s->ms_irq_enabled) in mxs_auart_enable_ms()
484 s->ms_irq_enabled = true; in mxs_auart_enable_ms()
486 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_enable_ms()
487 enable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_enable_ms()
490 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_enable_ms()
491 enable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_enable_ms()
493 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_enable_ms()
494 enable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_enable_ms()
496 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_enable_ms()
497 enable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_enable_ms()
505 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_disable_ms() local
510 if (!s->ms_irq_enabled) in mxs_auart_disable_ms()
513 s->ms_irq_enabled = false; in mxs_auart_disable_ms()
515 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_disable_ms()
516 disable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_disable_ms()
519 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_disable_ms()
520 disable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_disable_ms()
522 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_disable_ms()
523 disable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_disable_ms()
525 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_disable_ms()
526 disable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_disable_ms()
529 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
532 struct mxs_auart_port *s = (struct mxs_auart_port *) arg; in dma_rx_callback() local
533 struct tty_port *port = &s->port.state->port; in dma_rx_callback()
537 dma_unmap_sg(s->dev, &s->rx_sgl, 1, DMA_FROM_DEVICE); in dma_rx_callback()
539 stat = readl(s->port.membase + AUART_STAT); in dma_rx_callback()
544 tty_insert_flip_string(port, s->rx_dma_buf, count); in dma_rx_callback()
546 writel(stat, s->port.membase + AUART_STAT); in dma_rx_callback()
550 mxs_auart_dma_prep_rx(s); in dma_rx_callback()
553 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s) in mxs_auart_dma_prep_rx() argument
556 struct scatterlist *sgl = &s->rx_sgl; in mxs_auart_dma_prep_rx()
557 struct dma_chan *channel = s->rx_dma_chan; in mxs_auart_dma_prep_rx()
567 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_prep_rx()
572 sg_init_one(sgl, s->rx_dma_buf, UART_XMIT_SIZE); in mxs_auart_dma_prep_rx()
573 dma_map_sg(s->dev, sgl, 1, DMA_FROM_DEVICE); in mxs_auart_dma_prep_rx()
577 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_prep_rx()
583 desc->callback_param = s; in mxs_auart_dma_prep_rx()
589 static void mxs_auart_dma_exit_channel(struct mxs_auart_port *s) in mxs_auart_dma_exit_channel() argument
591 if (s->tx_dma_chan) { in mxs_auart_dma_exit_channel()
592 dma_release_channel(s->tx_dma_chan); in mxs_auart_dma_exit_channel()
593 s->tx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
595 if (s->rx_dma_chan) { in mxs_auart_dma_exit_channel()
596 dma_release_channel(s->rx_dma_chan); in mxs_auart_dma_exit_channel()
597 s->rx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
600 kfree(s->tx_dma_buf); in mxs_auart_dma_exit_channel()
601 kfree(s->rx_dma_buf); in mxs_auart_dma_exit_channel()
602 s->tx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
603 s->rx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
606 static void mxs_auart_dma_exit(struct mxs_auart_port *s) in mxs_auart_dma_exit() argument
610 s->port.membase + AUART_CTRL2_CLR); in mxs_auart_dma_exit()
612 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_exit()
613 s->flags &= ~MXS_AUART_DMA_ENABLED; in mxs_auart_dma_exit()
614 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_dma_exit()
615 clear_bit(MXS_AUART_DMA_RX_READY, &s->flags); in mxs_auart_dma_exit()
618 static int mxs_auart_dma_init(struct mxs_auart_port *s) in mxs_auart_dma_init() argument
620 if (auart_dma_enabled(s)) in mxs_auart_dma_init()
624 s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx"); in mxs_auart_dma_init()
625 if (!s->rx_dma_chan) in mxs_auart_dma_init()
627 s->rx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
628 if (!s->rx_dma_buf) in mxs_auart_dma_init()
632 s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx"); in mxs_auart_dma_init()
633 if (!s->tx_dma_chan) in mxs_auart_dma_init()
635 s->tx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
636 if (!s->tx_dma_buf) in mxs_auart_dma_init()
640 s->flags |= MXS_AUART_DMA_ENABLED; in mxs_auart_dma_init()
641 dev_dbg(s->dev, "enabled the DMA support."); in mxs_auart_dma_init()
644 s->port.fifosize = UART_XMIT_SIZE; in mxs_auart_dma_init()
649 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_init()
654 #define RTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
656 #define CTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
662 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_settermios() local
742 if (is_imx28_auart(s) in mxs_auart_settermios()
743 && test_bit(MXS_AUART_RTSCTS, &s->flags)) { in mxs_auart_settermios()
744 if (!mxs_auart_dma_init(s)) in mxs_auart_settermios()
770 if (auart_dma_enabled(s) && in mxs_auart_settermios()
771 !test_and_set_bit(MXS_AUART_DMA_RX_READY, &s->flags)) { in mxs_auart_settermios()
772 if (!mxs_auart_dma_prep_rx(s)) { in mxs_auart_settermios()
777 mxs_auart_dma_exit(s); in mxs_auart_settermios()
778 dev_err(s->dev, "We can not start up the DMA.\n"); in mxs_auart_settermios()
803 struct mxs_auart_port *s = context; in mxs_auart_irq_handle() local
804 u32 mctrl_temp = s->mctrl_prev; in mxs_auart_irq_handle()
805 u32 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_irq_handle()
807 istat = readl(s->port.membase + AUART_INTR); in mxs_auart_irq_handle()
814 s->port.membase + AUART_INTR_CLR); in mxs_auart_irq_handle()
819 if (irq == s->gpio_irq[UART_GPIO_CTS] || in mxs_auart_irq_handle()
820 irq == s->gpio_irq[UART_GPIO_DCD] || in mxs_auart_irq_handle()
821 irq == s->gpio_irq[UART_GPIO_DSR] || in mxs_auart_irq_handle()
822 irq == s->gpio_irq[UART_GPIO_RI]) in mxs_auart_irq_handle()
823 mxs_auart_modem_status(s, in mxs_auart_irq_handle()
824 mctrl_gpio_get(s->gpios, &mctrl_temp)); in mxs_auart_irq_handle()
827 if (CTS_AT_AUART() && s->ms_irq_enabled) in mxs_auart_irq_handle()
828 uart_handle_cts_change(&s->port, in mxs_auart_irq_handle()
831 s->port.membase + AUART_INTR_CLR); in mxs_auart_irq_handle()
836 if (!auart_dma_enabled(s)) in mxs_auart_irq_handle()
837 mxs_auart_rx_chars(s); in mxs_auart_irq_handle()
842 mxs_auart_tx_chars(s); in mxs_auart_irq_handle()
892 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_startup() local
894 ret = clk_prepare_enable(s->clk); in mxs_auart_startup()
921 mctrl_gpio_get(s->gpios, &s->mctrl_prev); in mxs_auart_startup()
923 s->ms_irq_enabled = false; in mxs_auart_startup()
929 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_shutdown() local
933 if (auart_dma_enabled(s)) in mxs_auart_shutdown()
934 mxs_auart_dma_exit(s); in mxs_auart_shutdown()
945 clk_disable_unprepare(s->clk); in mxs_auart_shutdown()
959 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_start_tx() local
964 mxs_auart_tx_chars(s); in mxs_auart_start_tx()
1026 struct mxs_auart_port *s; in auart_console_write() local
1034 s = auart_port[co->index]; in auart_console_write()
1035 port = &s->port; in auart_console_write()
1037 clk_enable(s->clk); in auart_console_write()
1068 clk_disable(s->clk); in auart_console_write()
1110 struct mxs_auart_port *s; in auart_console_setup() local
1124 s = auart_port[co->index]; in auart_console_setup()
1125 if (!s) in auart_console_setup()
1128 ret = clk_prepare_enable(s->clk); in auart_console_setup()
1135 auart_console_get_options(&s->port, &baud, &parity, &bits); in auart_console_setup()
1137 ret = uart_set_options(&s->port, co, baud, parity, bits, flow); in auart_console_setup()
1139 clk_disable_unprepare(s->clk); in auart_console_setup()
1171 static int serial_mxs_probe_dt(struct mxs_auart_port *s, in serial_mxs_probe_dt() argument
1186 s->port.line = ret; in serial_mxs_probe_dt()
1189 set_bit(MXS_AUART_RTSCTS, &s->flags); in serial_mxs_probe_dt()
1194 static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) in mxs_auart_init_gpios() argument
1199 s->gpios = mctrl_gpio_init_noauto(dev, 0); in mxs_auart_init_gpios()
1200 if (IS_ERR(s->gpios)) in mxs_auart_init_gpios()
1201 return PTR_ERR(s->gpios); in mxs_auart_init_gpios()
1205 if (test_bit(MXS_AUART_RTSCTS, &s->flags)) in mxs_auart_init_gpios()
1208 clear_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_init_gpios()
1212 gpiod = mctrl_gpio_to_gpiod(s->gpios, i); in mxs_auart_init_gpios()
1214 s->gpio_irq[i] = gpiod_to_irq(gpiod); in mxs_auart_init_gpios()
1216 s->gpio_irq[i] = -EINVAL; in mxs_auart_init_gpios()
1222 static void mxs_auart_free_gpio_irq(struct mxs_auart_port *s) in mxs_auart_free_gpio_irq() argument
1227 if (s->gpio_irq[i] >= 0) in mxs_auart_free_gpio_irq()
1228 free_irq(s->gpio_irq[i], s); in mxs_auart_free_gpio_irq()
1231 static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) in mxs_auart_request_gpio_irq() argument
1233 int *irq = s->gpio_irq; in mxs_auart_request_gpio_irq()
1243 IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); in mxs_auart_request_gpio_irq()
1245 dev_err(s->dev, "%s - Can't get %d irq\n", in mxs_auart_request_gpio_irq()
1255 free_irq(irq[i], s); in mxs_auart_request_gpio_irq()
1264 struct mxs_auart_port *s; in mxs_auart_probe() local
1269 s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); in mxs_auart_probe()
1270 if (!s) in mxs_auart_probe()
1273 ret = serial_mxs_probe_dt(s, pdev); in mxs_auart_probe()
1275 s->port.line = pdev->id < 0 ? 0 : pdev->id; in mxs_auart_probe()
1278 if (s->port.line >= ARRAY_SIZE(auart_port)) { in mxs_auart_probe()
1279 dev_err(&pdev->dev, "serial%d out of range\n", s->port.line); in mxs_auart_probe()
1285 s->devtype = pdev->id_entry->driver_data; in mxs_auart_probe()
1288 s->clk = devm_clk_get(&pdev->dev, NULL); in mxs_auart_probe()
1289 if (IS_ERR(s->clk)) in mxs_auart_probe()
1290 return PTR_ERR(s->clk); in mxs_auart_probe()
1297 s->port.mapbase = r->start; in mxs_auart_probe()
1298 s->port.membase = ioremap(r->start, resource_size(r)); in mxs_auart_probe()
1299 s->port.ops = &mxs_auart_ops; in mxs_auart_probe()
1300 s->port.iotype = UPIO_MEM; in mxs_auart_probe()
1301 s->port.fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_probe()
1302 s->port.uartclk = clk_get_rate(s->clk); in mxs_auart_probe()
1303 s->port.type = PORT_IMX; in mxs_auart_probe()
1304 s->port.dev = s->dev = &pdev->dev; in mxs_auart_probe()
1306 s->mctrl_prev = 0; in mxs_auart_probe()
1312 s->port.irq = irq; in mxs_auart_probe()
1314 dev_name(&pdev->dev), s); in mxs_auart_probe()
1318 platform_set_drvdata(pdev, s); in mxs_auart_probe()
1320 ret = mxs_auart_init_gpios(s, &pdev->dev); in mxs_auart_probe()
1329 ret = mxs_auart_request_gpio_irq(s); in mxs_auart_probe()
1333 auart_port[s->port.line] = s; in mxs_auart_probe()
1335 mxs_auart_reset_deassert(&s->port); in mxs_auart_probe()
1337 ret = uart_add_one_port(&auart_driver, &s->port); in mxs_auart_probe()
1341 version = readl(s->port.membase + AUART_VERSION); in mxs_auart_probe()
1349 mxs_auart_free_gpio_irq(s); in mxs_auart_probe()
1356 struct mxs_auart_port *s = platform_get_drvdata(pdev); in mxs_auart_remove() local
1358 uart_remove_one_port(&auart_driver, &s->port); in mxs_auart_remove()
1360 mxs_auart_free_gpio_irq(s); in mxs_auart_remove()