ASoC: rsnd: don't care under/over run error when PIO
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 15 Jun 2015 06:20:54 +0000 (06:20 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 16 Jun 2015 11:34:00 +0000 (12:34 +0100)
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>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/ssi.c

index 50fa3928a0036e07f517e964b9457752ee18dc79..856917392b790fa89439fb8b2b11364d15140618 100644 (file)
@@ -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);
 
                /*