|
|
@@ -271,6 +271,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|
|
{
|
|
|
struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
|
|
|
int ret = 0;
|
|
|
+ u32 data_delay;
|
|
|
|
|
|
pm_runtime_get_sync(mcasp->dev);
|
|
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
|
@@ -278,18 +279,25 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|
|
case SND_SOC_DAIFMT_AC97:
|
|
|
mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
|
|
|
mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
|
|
|
+
|
|
|
+ /* No delay after FS */
|
|
|
+ data_delay = 0;
|
|
|
break;
|
|
|
default:
|
|
|
/* configure a full-word SYNC pulse (LRCLK) */
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
|
|
|
|
|
|
- /* make 1st data bit occur one ACLK cycle after the frame sync */
|
|
|
- mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
|
|
|
- mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
|
|
|
+ /* 1st data bit occur one ACLK cycle after the frame sync */
|
|
|
+ data_delay = 1;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
|
|
|
+ FSXDLY(3));
|
|
|
+ mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(data_delay),
|
|
|
+ FSRDLY(3));
|
|
|
+
|
|
|
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
|
|
case SND_SOC_DAIFMT_CBS_CFS:
|
|
|
/* codec is clock and frame slave */
|