Lines Matching refs:s
190 static inline int is_imx28_auart(struct mxs_auart_port *s) in is_imx28_auart() argument
192 return s->devtype == IMX28_AUART; in is_imx28_auart()
195 static inline bool auart_dma_enabled(struct mxs_auart_port *s) in auart_dma_enabled() argument
197 return s->flags & MXS_AUART_DMA_ENABLED; in auart_dma_enabled()
204 static void mxs_auart_tx_chars(struct mxs_auart_port *s);
208 struct mxs_auart_port *s = param; in dma_tx_callback() local
209 struct circ_buf *xmit = &s->port.state->xmit; in dma_tx_callback()
211 dma_unmap_sg(s->dev, &s->tx_sgl, 1, DMA_TO_DEVICE); in dma_tx_callback()
214 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in dma_tx_callback()
219 uart_write_wakeup(&s->port); in dma_tx_callback()
221 mxs_auart_tx_chars(s); in dma_tx_callback()
224 static int mxs_auart_dma_tx(struct mxs_auart_port *s, int size) in mxs_auart_dma_tx() argument
227 struct scatterlist *sgl = &s->tx_sgl; in mxs_auart_dma_tx()
228 struct dma_chan *channel = s->tx_dma_chan; in mxs_auart_dma_tx()
236 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_tx()
241 sg_init_one(sgl, s->tx_dma_buf, size); in mxs_auart_dma_tx()
242 dma_map_sg(s->dev, sgl, 1, DMA_TO_DEVICE); in mxs_auart_dma_tx()
246 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_tx()
252 desc->callback_param = s; in mxs_auart_dma_tx()
258 static void mxs_auart_tx_chars(struct mxs_auart_port *s) in mxs_auart_tx_chars() argument
260 struct circ_buf *xmit = &s->port.state->xmit; in mxs_auart_tx_chars()
262 if (auart_dma_enabled(s)) { in mxs_auart_tx_chars()
265 void *buffer = s->tx_dma_buf; in mxs_auart_tx_chars()
267 if (test_and_set_bit(MXS_AUART_DMA_TX_SYNC, &s->flags)) in mxs_auart_tx_chars()
270 while (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
283 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
284 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
287 mxs_auart_dma_tx(s, i); in mxs_auart_tx_chars()
289 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_tx_chars()
296 while (!(readl(s->port.membase + AUART_STAT) & in mxs_auart_tx_chars()
298 if (s->port.x_char) { in mxs_auart_tx_chars()
299 s->port.icount.tx++; in mxs_auart_tx_chars()
300 writel(s->port.x_char, in mxs_auart_tx_chars()
301 s->port.membase + AUART_DATA); in mxs_auart_tx_chars()
302 s->port.x_char = 0; in mxs_auart_tx_chars()
305 if (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { in mxs_auart_tx_chars()
306 s->port.icount.tx++; in mxs_auart_tx_chars()
308 s->port.membase + AUART_DATA); in mxs_auart_tx_chars()
314 uart_write_wakeup(&s->port); in mxs_auart_tx_chars()
316 if (uart_circ_empty(&(s->port.state->xmit))) in mxs_auart_tx_chars()
318 s->port.membase + AUART_INTR_CLR); in mxs_auart_tx_chars()
321 s->port.membase + AUART_INTR_SET); in mxs_auart_tx_chars()
323 if (uart_tx_stopped(&s->port)) in mxs_auart_tx_chars()
324 mxs_auart_stop_tx(&s->port); in mxs_auart_tx_chars()
327 static void mxs_auart_rx_char(struct mxs_auart_port *s) in mxs_auart_rx_char() argument
333 c = readl(s->port.membase + AUART_DATA); in mxs_auart_rx_char()
334 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_rx_char()
337 s->port.icount.rx++; in mxs_auart_rx_char()
340 s->port.icount.brk++; in mxs_auart_rx_char()
341 if (uart_handle_break(&s->port)) in mxs_auart_rx_char()
344 s->port.icount.parity++; in mxs_auart_rx_char()
346 s->port.icount.frame++; in mxs_auart_rx_char()
352 stat &= s->port.read_status_mask; in mxs_auart_rx_char()
362 s->port.icount.overrun++; in mxs_auart_rx_char()
364 if (uart_handle_sysrq_char(&s->port, c)) in mxs_auart_rx_char()
367 uart_insert_char(&s->port, stat, AUART_STAT_OERR, c, flag); in mxs_auart_rx_char()
369 writel(stat, s->port.membase + AUART_STAT); in mxs_auart_rx_char()
372 static void mxs_auart_rx_chars(struct mxs_auart_port *s) in mxs_auart_rx_chars() argument
377 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_rx_chars()
380 mxs_auart_rx_char(s); in mxs_auart_rx_chars()
383 writel(stat, s->port.membase + AUART_STAT); in mxs_auart_rx_chars()
384 tty_flip_buffer_push(&s->port.state->port); in mxs_auart_rx_chars()
406 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_type() local
408 return dev_name(s->dev); in mxs_auart_type()
417 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_set_mctrl() local
431 mctrl_gpio_set(s->gpios, mctrl); in mxs_auart_set_mctrl()
435 static u32 mxs_auart_modem_status(struct mxs_auart_port *s, u32 mctrl) in mxs_auart_modem_status() argument
439 mctrl_diff = mctrl ^ s->mctrl_prev; in mxs_auart_modem_status()
440 s->mctrl_prev = mctrl; in mxs_auart_modem_status()
441 if (mctrl_diff & MCTRL_ANY_DELTA && s->ms_irq_enabled && in mxs_auart_modem_status()
442 s->port.state != NULL) { in mxs_auart_modem_status()
444 s->port.icount.rng++; in mxs_auart_modem_status()
446 s->port.icount.dsr++; in mxs_auart_modem_status()
448 uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD); in mxs_auart_modem_status()
450 uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS); in mxs_auart_modem_status()
452 wake_up_interruptible(&s->port.state->port.delta_msr_wait); in mxs_auart_modem_status()
459 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_get_mctrl() local
466 return mctrl_gpio_get(s->gpios, &mctrl); in mxs_auart_get_mctrl()
474 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_enable_ms() local
479 if (s->ms_irq_enabled) in mxs_auart_enable_ms()
482 s->ms_irq_enabled = true; in mxs_auart_enable_ms()
484 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_enable_ms()
485 enable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_enable_ms()
488 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_enable_ms()
489 enable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_enable_ms()
491 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_enable_ms()
492 enable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_enable_ms()
494 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_enable_ms()
495 enable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_enable_ms()
503 struct mxs_auart_port *s = to_auart_port(port); in mxs_auart_disable_ms() local
508 if (!s->ms_irq_enabled) in mxs_auart_disable_ms()
511 s->ms_irq_enabled = false; in mxs_auart_disable_ms()
513 if (s->gpio_irq[UART_GPIO_CTS] >= 0) in mxs_auart_disable_ms()
514 disable_irq(s->gpio_irq[UART_GPIO_CTS]); in mxs_auart_disable_ms()
517 if (s->gpio_irq[UART_GPIO_DSR] >= 0) in mxs_auart_disable_ms()
518 disable_irq(s->gpio_irq[UART_GPIO_DSR]); in mxs_auart_disable_ms()
520 if (s->gpio_irq[UART_GPIO_RI] >= 0) in mxs_auart_disable_ms()
521 disable_irq(s->gpio_irq[UART_GPIO_RI]); in mxs_auart_disable_ms()
523 if (s->gpio_irq[UART_GPIO_DCD] >= 0) in mxs_auart_disable_ms()
524 disable_irq(s->gpio_irq[UART_GPIO_DCD]); in mxs_auart_disable_ms()
527 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
530 struct mxs_auart_port *s = (struct mxs_auart_port *) arg; in dma_rx_callback() local
531 struct tty_port *port = &s->port.state->port; in dma_rx_callback()
535 dma_unmap_sg(s->dev, &s->rx_sgl, 1, DMA_FROM_DEVICE); in dma_rx_callback()
537 stat = readl(s->port.membase + AUART_STAT); in dma_rx_callback()
542 tty_insert_flip_string(port, s->rx_dma_buf, count); in dma_rx_callback()
544 writel(stat, s->port.membase + AUART_STAT); in dma_rx_callback()
548 mxs_auart_dma_prep_rx(s); in dma_rx_callback()
551 static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s) in mxs_auart_dma_prep_rx() argument
554 struct scatterlist *sgl = &s->rx_sgl; in mxs_auart_dma_prep_rx()
555 struct dma_chan *channel = s->rx_dma_chan; in mxs_auart_dma_prep_rx()
565 dev_err(s->dev, "step 1 error\n"); in mxs_auart_dma_prep_rx()
570 sg_init_one(sgl, s->rx_dma_buf, UART_XMIT_SIZE); in mxs_auart_dma_prep_rx()
571 dma_map_sg(s->dev, sgl, 1, DMA_FROM_DEVICE); in mxs_auart_dma_prep_rx()
575 dev_err(s->dev, "step 2 error\n"); in mxs_auart_dma_prep_rx()
581 desc->callback_param = s; in mxs_auart_dma_prep_rx()
587 static void mxs_auart_dma_exit_channel(struct mxs_auart_port *s) in mxs_auart_dma_exit_channel() argument
589 if (s->tx_dma_chan) { in mxs_auart_dma_exit_channel()
590 dma_release_channel(s->tx_dma_chan); in mxs_auart_dma_exit_channel()
591 s->tx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
593 if (s->rx_dma_chan) { in mxs_auart_dma_exit_channel()
594 dma_release_channel(s->rx_dma_chan); in mxs_auart_dma_exit_channel()
595 s->rx_dma_chan = NULL; in mxs_auart_dma_exit_channel()
598 kfree(s->tx_dma_buf); in mxs_auart_dma_exit_channel()
599 kfree(s->rx_dma_buf); in mxs_auart_dma_exit_channel()
600 s->tx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
601 s->rx_dma_buf = NULL; in mxs_auart_dma_exit_channel()
604 static void mxs_auart_dma_exit(struct mxs_auart_port *s) in mxs_auart_dma_exit() argument
608 s->port.membase + AUART_CTRL2_CLR); in mxs_auart_dma_exit()
610 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_exit()
611 s->flags &= ~MXS_AUART_DMA_ENABLED; in mxs_auart_dma_exit()
612 clear_bit(MXS_AUART_DMA_TX_SYNC, &s->flags); in mxs_auart_dma_exit()
613 clear_bit(MXS_AUART_DMA_RX_READY, &s->flags); in mxs_auart_dma_exit()
616 static int mxs_auart_dma_init(struct mxs_auart_port *s) in mxs_auart_dma_init() argument
618 if (auart_dma_enabled(s)) in mxs_auart_dma_init()
622 s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx"); in mxs_auart_dma_init()
623 if (!s->rx_dma_chan) in mxs_auart_dma_init()
625 s->rx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
626 if (!s->rx_dma_buf) in mxs_auart_dma_init()
630 s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx"); in mxs_auart_dma_init()
631 if (!s->tx_dma_chan) in mxs_auart_dma_init()
633 s->tx_dma_buf = kzalloc(UART_XMIT_SIZE, GFP_KERNEL | GFP_DMA); in mxs_auart_dma_init()
634 if (!s->tx_dma_buf) in mxs_auart_dma_init()
638 s->flags |= MXS_AUART_DMA_ENABLED; in mxs_auart_dma_init()
639 dev_dbg(s->dev, "enabled the DMA support."); in mxs_auart_dma_init()
642 s->port.fifosize = UART_XMIT_SIZE; in mxs_auart_dma_init()
647 mxs_auart_dma_exit_channel(s); in mxs_auart_dma_init()
652 #define RTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
654 #define CTS_AT_AUART() IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios, \
660 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_settermios() local
740 if (is_imx28_auart(s) in mxs_auart_settermios()
741 && test_bit(MXS_AUART_RTSCTS, &s->flags)) { in mxs_auart_settermios()
742 if (!mxs_auart_dma_init(s)) in mxs_auart_settermios()
766 if (auart_dma_enabled(s) && in mxs_auart_settermios()
767 !test_and_set_bit(MXS_AUART_DMA_RX_READY, &s->flags)) { in mxs_auart_settermios()
768 if (!mxs_auart_dma_prep_rx(s)) { in mxs_auart_settermios()
773 mxs_auart_dma_exit(s); in mxs_auart_settermios()
774 dev_err(s->dev, "We can not start up the DMA.\n"); in mxs_auart_settermios()
799 struct mxs_auart_port *s = context; in mxs_auart_irq_handle() local
800 u32 mctrl_temp = s->mctrl_prev; in mxs_auart_irq_handle()
801 u32 stat = readl(s->port.membase + AUART_STAT); in mxs_auart_irq_handle()
803 istat = readl(s->port.membase + AUART_INTR); in mxs_auart_irq_handle()
810 s->port.membase + AUART_INTR_CLR); in mxs_auart_irq_handle()
815 if (irq == s->gpio_irq[UART_GPIO_CTS] || in mxs_auart_irq_handle()
816 irq == s->gpio_irq[UART_GPIO_DCD] || in mxs_auart_irq_handle()
817 irq == s->gpio_irq[UART_GPIO_DSR] || in mxs_auart_irq_handle()
818 irq == s->gpio_irq[UART_GPIO_RI]) in mxs_auart_irq_handle()
819 mxs_auart_modem_status(s, in mxs_auart_irq_handle()
820 mctrl_gpio_get(s->gpios, &mctrl_temp)); in mxs_auart_irq_handle()
823 if (CTS_AT_AUART() && s->ms_irq_enabled) in mxs_auart_irq_handle()
824 uart_handle_cts_change(&s->port, in mxs_auart_irq_handle()
827 s->port.membase + AUART_INTR_CLR); in mxs_auart_irq_handle()
832 if (!auart_dma_enabled(s)) in mxs_auart_irq_handle()
833 mxs_auart_rx_chars(s); in mxs_auart_irq_handle()
838 mxs_auart_tx_chars(s); in mxs_auart_irq_handle()
864 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_startup() local
866 ret = clk_prepare_enable(s->clk); in mxs_auart_startup()
887 mctrl_gpio_get(s->gpios, &s->mctrl_prev); in mxs_auart_startup()
889 s->ms_irq_enabled = false; in mxs_auart_startup()
895 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_shutdown() local
899 if (auart_dma_enabled(s)) in mxs_auart_shutdown()
900 mxs_auart_dma_exit(s); in mxs_auart_shutdown()
909 clk_disable_unprepare(s->clk); in mxs_auart_shutdown()
923 struct mxs_auart_port *s = to_auart_port(u); in mxs_auart_start_tx() local
928 mxs_auart_tx_chars(s); in mxs_auart_start_tx()
990 struct mxs_auart_port *s; in auart_console_write() local
998 s = auart_port[co->index]; in auart_console_write()
999 port = &s->port; in auart_console_write()
1001 clk_enable(s->clk); in auart_console_write()
1032 clk_disable(s->clk); in auart_console_write()
1074 struct mxs_auart_port *s; in auart_console_setup() local
1088 s = auart_port[co->index]; in auart_console_setup()
1089 if (!s) in auart_console_setup()
1092 ret = clk_prepare_enable(s->clk); in auart_console_setup()
1099 auart_console_get_options(&s->port, &baud, &parity, &bits); in auart_console_setup()
1101 ret = uart_set_options(&s->port, co, baud, parity, bits, flow); in auart_console_setup()
1103 clk_disable_unprepare(s->clk); in auart_console_setup()
1135 static int serial_mxs_probe_dt(struct mxs_auart_port *s, in serial_mxs_probe_dt() argument
1150 s->port.line = ret; in serial_mxs_probe_dt()
1153 set_bit(MXS_AUART_RTSCTS, &s->flags); in serial_mxs_probe_dt()
1158 static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) in mxs_auart_init_gpios() argument
1163 s->gpios = mctrl_gpio_init(dev, 0); in mxs_auart_init_gpios()
1164 if (IS_ERR(s->gpios)) in mxs_auart_init_gpios()
1165 return PTR_ERR(s->gpios); in mxs_auart_init_gpios()
1169 if (test_bit(MXS_AUART_RTSCTS, &s->flags)) in mxs_auart_init_gpios()
1172 clear_bit(MXS_AUART_RTSCTS, &s->flags); in mxs_auart_init_gpios()
1176 gpiod = mctrl_gpio_to_gpiod(s->gpios, i); in mxs_auart_init_gpios()
1178 s->gpio_irq[i] = gpiod_to_irq(gpiod); in mxs_auart_init_gpios()
1180 s->gpio_irq[i] = -EINVAL; in mxs_auart_init_gpios()
1186 static void mxs_auart_free_gpio_irq(struct mxs_auart_port *s) in mxs_auart_free_gpio_irq() argument
1191 if (s->gpio_irq[i] >= 0) in mxs_auart_free_gpio_irq()
1192 free_irq(s->gpio_irq[i], s); in mxs_auart_free_gpio_irq()
1195 static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) in mxs_auart_request_gpio_irq() argument
1197 int *irq = s->gpio_irq; in mxs_auart_request_gpio_irq()
1207 IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); in mxs_auart_request_gpio_irq()
1209 dev_err(s->dev, "%s - Can't get %d irq\n", in mxs_auart_request_gpio_irq()
1218 free_irq(irq[i], s); in mxs_auart_request_gpio_irq()
1227 struct mxs_auart_port *s; in mxs_auart_probe() local
1232 s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); in mxs_auart_probe()
1233 if (!s) in mxs_auart_probe()
1236 ret = serial_mxs_probe_dt(s, pdev); in mxs_auart_probe()
1238 s->port.line = pdev->id < 0 ? 0 : pdev->id; in mxs_auart_probe()
1244 s->devtype = pdev->id_entry->driver_data; in mxs_auart_probe()
1247 s->clk = devm_clk_get(&pdev->dev, NULL); in mxs_auart_probe()
1248 if (IS_ERR(s->clk)) in mxs_auart_probe()
1249 return PTR_ERR(s->clk); in mxs_auart_probe()
1256 s->port.mapbase = r->start; in mxs_auart_probe()
1257 s->port.membase = ioremap(r->start, resource_size(r)); in mxs_auart_probe()
1258 s->port.ops = &mxs_auart_ops; in mxs_auart_probe()
1259 s->port.iotype = UPIO_MEM; in mxs_auart_probe()
1260 s->port.fifosize = MXS_AUART_FIFO_SIZE; in mxs_auart_probe()
1261 s->port.uartclk = clk_get_rate(s->clk); in mxs_auart_probe()
1262 s->port.type = PORT_IMX; in mxs_auart_probe()
1263 s->port.dev = s->dev = &pdev->dev; in mxs_auart_probe()
1265 s->mctrl_prev = 0; in mxs_auart_probe()
1271 s->port.irq = irq; in mxs_auart_probe()
1273 dev_name(&pdev->dev), s); in mxs_auart_probe()
1277 platform_set_drvdata(pdev, s); in mxs_auart_probe()
1279 ret = mxs_auart_init_gpios(s, &pdev->dev); in mxs_auart_probe()
1288 ret = mxs_auart_request_gpio_irq(s); in mxs_auart_probe()
1292 auart_port[s->port.line] = s; in mxs_auart_probe()
1294 mxs_auart_reset(&s->port); in mxs_auart_probe()
1296 ret = uart_add_one_port(&auart_driver, &s->port); in mxs_auart_probe()
1300 version = readl(s->port.membase + AUART_VERSION); in mxs_auart_probe()
1308 mxs_auart_free_gpio_irq(s); in mxs_auart_probe()
1315 struct mxs_auart_port *s = platform_get_drvdata(pdev); in mxs_auart_remove() local
1317 uart_remove_one_port(&auart_driver, &s->port); in mxs_auart_remove()
1319 mxs_auart_free_gpio_irq(s); in mxs_auart_remove()