ASoC: rsnd: fixup SND_SOC_DAIFMT_xB_xF behavior

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>
This commit is contained in:
Kuninori Morimoto 2014-07-31 18:08:18 -07:00 коммит произвёл Mark Brown
Родитель 7c63f3c02f
Коммит 1a7889ca8a
1 изменённых файлов: 22 добавлений и 21 удалений

Просмотреть файл

@ -624,40 +624,41 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
return -EINVAL; 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 */ /* set format */
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_I2S:
rdai->sys_delay = 0; rdai->sys_delay = 0;
rdai->data_alignment = 0; rdai->data_alignment = 0;
rdai->frm_clk_inv = 0;
break; break;
case SND_SOC_DAIFMT_LEFT_J: case SND_SOC_DAIFMT_LEFT_J:
rdai->sys_delay = 1; rdai->sys_delay = 1;
rdai->data_alignment = 0; rdai->data_alignment = 0;
rdai->frm_clk_inv = 1;
break; break;
case SND_SOC_DAIFMT_RIGHT_J: case SND_SOC_DAIFMT_RIGHT_J:
rdai->sys_delay = 1; rdai->sys_delay = 1;
rdai->data_alignment = 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; break;
} }