diff mbox

[v2,2/3] serial: mxs-auart: add the DMA support for mx28

Message ID 50A4B1CE.5070203@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Huang Shijie Nov. 15, 2012, 9:11 a.m. UTC
? 2012?11?15? 15:22, Lauri Hintsala ??:
> Hi,
>
> On 11/15/2012 05:20 AM, Huang Shijie wrote:
>> ? 2012?11?13? 17:42, Lauri Hintsala ??:
>>> Hi Huang,
>>>
>>> DMA support doesn't work with latest stable v3.6.5 or development
>>> 3.7-rc5 kernels. I get following error message when I open the serial
>>> port /dev/ttyAPP0:
>>>
>>> [ 48.730000] mxs-auart 8006a000.serial: step 1 error
>>> [ 48.750000] mxs-auart 8006a000.serial: We can not start up the DMA.
>>>
>> I tested this patch set in imx28-evk board Rev C with 
>> linux-next-20121114.
>> it works fine.
>>
>> Maybe you can try the linux-next code.
>
> I tested linux-next-20121114 on apx4devkit (imx28 based device) and I 
> got the same error message:
>
> # stty -F /dev/ttyAPP0 crtscts; microcom /dev/ttyAPP0 -s 115200
> [  133.710000] mxs-auart 8006a000.serial: step 1 error
> [  133.720000] mxs-auart 8006a000.serial: We can not start up the DMA.
Could you test this patch?

thanks
Huang  Shijie

Comments

Lauri Hintsala Nov. 15, 2012, 11:51 a.m. UTC | #1
Hi,

On 11/15/2012 11:11 AM, Huang Shijie wrote:
>> I tested linux-next-20121114 on apx4devkit (imx28 based device) and I
>> got the same error message:
>>
>> # stty -F /dev/ttyAPP0 crtscts; microcom /dev/ttyAPP0 -s 115200
>> [  133.710000] mxs-auart 8006a000.serial: step 1 error
>> [  133.720000] mxs-auart 8006a000.serial: We can not start up the DMA.
> Could you test this patch?

I don't get error messages with your latest patch but the CPU freezes 
after it has received first byte. Freezing happens only if flow control 
(and of course DMA) is enabled. Sending data doesn't freeze the CPU. Are 
you able to send data without freezing?

I used busybox's microcom to transfer data.

Lauri
diff mbox

Patch

From 502db325af8664e239be3da47f32d496f3db036f Mon Sep 17 00:00:00 2001
From: Huang Shijie <b32955@freescale.com>
Date: Thu, 15 Nov 2012 16:24:31 +0800
Subject: [PATCH] fix patch


Signed-off-by: Huang Shijie <b32955@freescale.com>
---
 drivers/tty/serial/mxs-auart.c |   25 +++++++++++++------------
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index d593e0a..0e60ef2 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -542,7 +542,7 @@  static int mxs_auart_dma_init(struct mxs_auart_port *s)
 	dma_cap_mask_t mask;
 
 	if (auart_dma_enabled(s))
-		return 0;
+		return -EBUSY;
 
 	/* We do not get the right DMA channels. */
 	if (s->dma_channel_rx == -1 || s->dma_channel_rx == -1)
@@ -666,10 +666,21 @@  static void mxs_auart_settermios(struct uart_port *u,
 		 * in mx28.
 		 */
 		if (is_imx28_auart(s) && (s->flags & MXS_AUART_DMA_CONFIG)) {
-			if (!mxs_auart_dma_init(s))
+			if (!mxs_auart_dma_init(s)) {
 				/* enable DMA tranfer */
 				ctrl2 |= AUART_CTRL2_TXDMAE | AUART_CTRL2_RXDMAE
 				       | AUART_CTRL2_DMAONERR;
+
+				/* prepare for the DMA RX. */
+				if (!mxs_auart_dma_prep_rx(s)) {
+					/* Disable the normal RX irq. */
+					writel(AUART_INTR_RXIEN,
+						u->membase + AUART_INTR_CLR);
+				} else {
+					mxs_auart_dma_exit(s);
+					dev_err(s->dev, "DMA failed.\n");
+				}
+			}
 		}
 		ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
 	} else {
@@ -687,16 +698,6 @@  static void mxs_auart_settermios(struct uart_port *u,
 
 	uart_update_timeout(u, termios->c_cflag, baud);
 
-	/* prepare for the DMA RX. */
-	if (auart_dma_enabled(s)) {
-		if (!mxs_auart_dma_prep_rx(s)) {
-			/* Disable the normal RX interrupt. */
-			writel(AUART_INTR_RXIEN, u->membase + AUART_INTR_CLR);
-		} else {
-			mxs_auart_dma_exit(s);
-			dev_err(s->dev, "We can not start up the DMA.\n");
-		}
-	}
 }
 
 static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
-- 
1.7.0.4