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:
Родитель
7c63f3c02f
Коммит
1a7889ca8a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче