ASoC: rsnd: care SWSP bit for TDM/non-TDM
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 2 Dec 2015 07:34:28 +0000 (07:34 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 2 Dec 2015 11:15:27 +0000 (11:15 +0000)
SSICR::SWSP bit controls WS signal low/high, but in case of TDM
it is inverted. This patch solves this issue.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/ssi.c

index 628739f13f9990e16f003771186639f088e7ce12..79c3211a1e7f75aa8ee55b96e78c39211b5815eb 100644 (file)
@@ -265,6 +265,9 @@ static int rsnd_ssi_config_init(struct rsnd_ssi *ssi,
        u32 cr_own;
        u32 cr_mode;
        u32 wsr;
+       int is_tdm;
+
+       is_tdm = (rsnd_get_slot_runtime(io) >= 6) ? 1 : 0;
 
        /*
         * always use 32bit system word.
@@ -274,7 +277,7 @@ static int rsnd_ssi_config_init(struct rsnd_ssi *ssi,
 
        if (rdai->bit_clk_inv)
                cr_own |= SCKP;
-       if (rdai->frm_clk_inv)
+       if (rdai->frm_clk_inv ^ is_tdm)
                cr_own |= SWSP;
        if (rdai->data_alignment)
                cr_own |= SDTA;
@@ -307,7 +310,7 @@ static int rsnd_ssi_config_init(struct rsnd_ssi *ssi,
         *      rsnd_ssiu_init_gen2()
         */
        wsr = ssi->wsr;
-       if (rsnd_get_slot_runtime(io) >= 6) {
+       if (is_tdm) {
                wsr     |= WS_MODE;
                cr_own  |= CHNL_8;
        }