ASoC: rsnd: fixup SND_SOC_DAIFMT_xB_xF behavior
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 1 Aug 2014 01:08:18 +0000 (18:08 -0700)
committerStephane Desneux <stephane.desneux@open.eurogiciel.org>
Wed, 4 Feb 2015 10:15:45 +0000 (11:15 +0100)
In current R-Car rsnd driver,
the SND_SOC_DAIFMT_xB_xF flags are used to HW default behavior,
but, it should be used to specific format.
The waveforms of LEFT_J/RIGHT_J format with
SND_SOC_DAIFMT_NB_NF flag will be
started from "falling edge" without this patch.
But, it should be started from "rising edge".

Reported-by: Jun Watanabe <jun.watanabe.ue@renesas.com>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
(cherry picked from commit 1a7889ca8aba333d7c74fad543d692c31bc7f280)
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
sound/soc/sh/rcar/core.c

index 60a152f..b67becb 100644 (file)
@@ -624,40 +624,41 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
                return -EINVAL;
        }
 
-       /* set clock inversion */
-       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
-       case SND_SOC_DAIFMT_NB_IF:
-               rdai->bit_clk_inv = 0;
-               rdai->frm_clk_inv = 1;
-               break;
-       case SND_SOC_DAIFMT_IB_NF:
-               rdai->bit_clk_inv = 1;
-               rdai->frm_clk_inv = 0;
-               break;
-       case SND_SOC_DAIFMT_IB_IF:
-               rdai->bit_clk_inv = 1;
-               rdai->frm_clk_inv = 1;
-               break;
-       case SND_SOC_DAIFMT_NB_NF:
-       default:
-               rdai->bit_clk_inv = 0;
-               rdai->frm_clk_inv = 0;
-               break;
-       }
-
        /* set format */
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
        case SND_SOC_DAIFMT_I2S:
                rdai->sys_delay = 0;
                rdai->data_alignment = 0;
+               rdai->frm_clk_inv = 0;
                break;
        case SND_SOC_DAIFMT_LEFT_J:
                rdai->sys_delay = 1;
                rdai->data_alignment = 0;
+               rdai->frm_clk_inv = 1;
                break;
        case SND_SOC_DAIFMT_RIGHT_J:
                rdai->sys_delay = 1;
                rdai->data_alignment = 1;
+               rdai->frm_clk_inv = 1;
+               break;
+       }
+
+       /* set clock inversion */
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_IF:
+               rdai->bit_clk_inv =  rdai->bit_clk_inv;
+               rdai->frm_clk_inv = !rdai->frm_clk_inv;
+               break;
+       case SND_SOC_DAIFMT_IB_NF:
+               rdai->bit_clk_inv = !rdai->bit_clk_inv;
+               rdai->frm_clk_inv =  rdai->frm_clk_inv;
+               break;
+       case SND_SOC_DAIFMT_IB_IF:
+               rdai->bit_clk_inv = !rdai->bit_clk_inv;
+               rdai->frm_clk_inv = !rdai->frm_clk_inv;
+               break;
+       case SND_SOC_DAIFMT_NB_NF:
+       default:
                break;
        }