diff mbox

[01/21] ASoC: rsnd: don't care under/over run error when PIO

Message ID 87si9tv6iv.wl%kuninori.morimoto.gx@renesas.com (mailing list archive)
State Accepted
Commit 12927a8f80264256e6cb2d3241fe9d6f4ad7face
Headers show

Commit Message

Kuninori Morimoto June 15, 2015, 6:20 a.m. UTC
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

PIO is used only for checking data path / codec settings. And underrun
is very normal when PIO mode. Let's don't care about under/over run
error when PIO case. Otherwise, 1) too many HW restart happens, 2) some
sounds which need much data transfer can't play since it falls into
error detection method which was created for DMA transfer

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
---
 sound/soc/sh/rcar/ssi.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

Comments

Mark Brown June 16, 2015, 11:41 a.m. UTC | #1
On Mon, Jun 15, 2015 at 06:20:54AM +0000, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> PIO is used only for checking data path / codec settings. And underrun
> is very normal when PIO mode. Let's don't care about under/over run
> error when PIO case. Otherwise, 1) too many HW restart happens, 2) some
> sounds which need much data transfer can't play since it falls into
> error detection method which was created for DMA transfer

I've applied the whole series but I'm not thrilled with this one.  I
guess what you mean to say is that this is only used during bringup of a
new platform in which case it's not that big a deal but otherwise then
the usual thing with PIO is to implement FIQ support to keep the
hardware full.
diff mbox

Patch

diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 50fa392..8569173 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -199,15 +199,17 @@  static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
 		}
 	}
 
-	cr_mode = rsnd_ssi_is_dma_mode(&ssi->mod) ?
-		DMEN :	/* DMA : enable DMA */
-		DIEN;	/* PIO : enable Data interrupt */
-
+	if (rsnd_ssi_is_dma_mode(&ssi->mod)) {
+		cr_mode = UIEN | OIEN |	/* over/under run */
+			  DMEN;		/* DMA : enable DMA */
+	} else {
+		cr_mode = DIEN;		/* PIO : enable Data interrupt */
+	}
 
 	cr  =	ssi->cr_own	|
 		ssi->cr_clk	|
 		cr_mode		|
-		UIEN | OIEN | EN;
+		EN;
 
 	rsnd_mod_write(&ssi->mod, SSICR, cr);
 
@@ -452,8 +454,8 @@  static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
 		rsnd_dai_pointer_update(io, sizeof(*buf));
 	}
 
-	/* PIO / DMA */
-	if (status & (UIRQ | OIRQ)) {
+	/* DMA only */
+	if (is_dma && (status & (UIRQ | OIRQ))) {
 		struct device *dev = rsnd_priv_to_dev(priv);
 
 		/*