On Thu, Apr 26, 2012 at 06:37:11PM +0800, Huang Shijie wrote: > Add the DMA support for uart RX and TX. > > Signed-off-by: Huang Shijie <b32955@xxxxxxxxxxxxx> > --- > .../bindings/tty/serial/fsl-imx-uart.txt | 7 + > drivers/tty/serial/imx.c | 386 +++++++++++++++++++- > 2 files changed, 389 insertions(+), 4 deletions(-) > > + enum dma_status status; > + unsigned long flags; > + int ret; > + > + status = chan->device->device_tx_status(chan, (dma_cookie_t)NULL, NULL); > + if (DMA_IN_PROGRESS == status) > + return; > + > + spin_lock_irqsave(&sport->port.lock, flags); > + sport->tx_bytes = uart_circ_chars_pending(xmit); > + if (sport->tx_bytes > 0) { Instead of putting nearly the whole body of this function inside a 'if' you should return here. > + if (xmit->tail > xmit->head) { > + sport->dma_tx_nents = 2; > + sg_init_table(sgl, 2); > + sg_set_buf(sgl, xmit->buf + xmit->tail, > + UART_XMIT_SIZE - xmit->tail); > + sg_set_buf(&sgl[1], xmit->buf, xmit->head); > + } else { > + sport->dma_tx_nents = 1; > + sg_init_one(sgl, xmit->buf + xmit->tail, > + sport->tx_bytes); > + } > + spin_unlock_irqrestore(&sport->port.lock, flags); > + > + ret = dma_map_sg(sport->port.dev, sgl, > + sport->dma_tx_nents, DMA_TO_DEVICE); > + if (ret == 0) { > + pr_err("DMA mapping error for TX.\n"); Use dev_* functions. Whoever reads the above in the logs won't have a clue that it comes from the serial driver. > + return; > + } > + desc = dmaengine_prep_slave_sg(chan, sgl, > + sport->dma_tx_nents, DMA_MEM_TO_DEV, 0); > + if (!desc) { > + pr_err("We cannot prepare for the TX slave dma!\n"); > + return; > + } > + desc->callback = dma_tx_callback; > + desc->callback_param = sport; > + > + /* fire it */ > + dmaengine_submit(desc); > + dma_async_issue_pending(chan); > + return; > + } > + spin_unlock_irqrestore(&sport->port.lock, flags); > + return; > +} > + > +/* see the "i.MX61 SDMA Scripts User Manual.doc" for the parameters */ I can't see how the manual helps here. Please test this patch at least on one more SoC. There should be nothing i.MX6 specific in here, the fact that the i.MX6 is mentioned several times in the comments make me suspicious. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html