|
@@ -77,6 +77,7 @@ struct davinci_mcasp {
|
|
|
u32 fifo_base;
|
|
|
struct device *dev;
|
|
|
struct snd_pcm_substream *substreams[2];
|
|
|
+ unsigned int dai_fmt;
|
|
|
|
|
|
/* McASP specific data */
|
|
|
int tdm_slots;
|
|
@@ -398,6 +399,9 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|
|
bool fs_pol_rising;
|
|
|
bool inv_fs = false;
|
|
|
|
|
|
+ if (!fmt)
|
|
|
+ return 0;
|
|
|
+
|
|
|
pm_runtime_get_sync(mcasp->dev);
|
|
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
|
case SND_SOC_DAIFMT_DSP_A:
|
|
@@ -529,6 +533,8 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
|
|
|
}
|
|
|
+
|
|
|
+ mcasp->dai_fmt = fmt;
|
|
|
out:
|
|
|
pm_runtime_put(mcasp->dev);
|
|
|
return ret;
|
|
@@ -1026,6 +1032,10 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
|
|
|
int period_size = params_period_size(params);
|
|
|
int ret;
|
|
|
|
|
|
+ ret = davinci_mcasp_set_dai_fmt(cpu_dai, mcasp->dai_fmt);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
/*
|
|
|
* If mcasp is BCLK master, and a BCLK divider was not provided by
|
|
|
* the machine driver, we need to calculate the ratio.
|