diff options
author | Jarkko Nikula <jarkko.nikula@bitmer.com> | 2011-09-30 09:07:44 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-10-02 14:57:07 -0400 |
commit | 4dd0417253be35bfbe368c40ec5a10732b24fd65 (patch) | |
tree | 11da89922966d61ed18a91c456457b4384e6e0b4 /sound/soc/omap | |
parent | 177fdd89f9c3f3f157c0b5e0f9c25a3a7c37ecf7 (diff) |
ASoC: omap-mcbsp: Prepare for init time DAI format setting
Before commit 75d9ac4 ("ASoC: Allow DAI formats to be specified in the
dai_link") expectation for omap-mcbsp was that snd_soc_dai_set_fmt is to be
called first in machine hw_params callback before other CPU DAI functions.
Thus it was enough that only omap_mcbsp_dai_set_dai_fmt cleared the
mcbsp->regs structure. [Note that this was pure convention, it's always
been OK to set things on init -- broonie]
Now this doesn't hold anymore since machine drivers can set the DAI format
only once on init time and thus mcbsp->regs may get out of sync when other
CPU DAI functions are modifying them dynamically with different values
between the calls. Therefore clear the accessed mcbsp->regs bits and
bitfields in other functions too.
Signed-off-by: Jarkko Nikula <jarkko.nikula@bitmer.com>
Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/omap')
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 894f2f33f508..7f700610b3cb 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -317,6 +317,10 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
317 | return 0; | 317 | return 0; |
318 | } | 318 | } |
319 | 319 | ||
320 | regs->rcr2 &= ~(RPHASE | RFRLEN2(0x7f) | RWDLEN2(7)); | ||
321 | regs->xcr2 &= ~(RPHASE | XFRLEN2(0x7f) | XWDLEN2(7)); | ||
322 | regs->rcr1 &= ~(RFRLEN1(0x7f) | RWDLEN1(7)); | ||
323 | regs->xcr1 &= ~(XFRLEN1(0x7f) | XWDLEN1(7)); | ||
320 | format = mcbsp_data->fmt & SND_SOC_DAIFMT_FORMAT_MASK; | 324 | format = mcbsp_data->fmt & SND_SOC_DAIFMT_FORMAT_MASK; |
321 | wpf = channels = params_channels(params); | 325 | wpf = channels = params_channels(params); |
322 | if (channels == 2 && (format == SND_SOC_DAIFMT_I2S || | 326 | if (channels == 2 && (format == SND_SOC_DAIFMT_I2S || |
@@ -369,6 +373,8 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
369 | framesize = wlen * channels; | 373 | framesize = wlen * channels; |
370 | 374 | ||
371 | /* Set FS period and length in terms of bit clock periods */ | 375 | /* Set FS period and length in terms of bit clock periods */ |
376 | regs->srgr2 &= ~FPER(0xfff); | ||
377 | regs->srgr1 &= ~FWID(0xff); | ||
372 | switch (format) { | 378 | switch (format) { |
373 | case SND_SOC_DAIFMT_I2S: | 379 | case SND_SOC_DAIFMT_I2S: |
374 | case SND_SOC_DAIFMT_LEFT_J: | 380 | case SND_SOC_DAIFMT_LEFT_J: |
@@ -505,6 +511,7 @@ static int omap_mcbsp_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, | |||
505 | return -ENODEV; | 511 | return -ENODEV; |
506 | 512 | ||
507 | mcbsp_data->clk_div = div; | 513 | mcbsp_data->clk_div = div; |
514 | regs->srgr1 &= ~CLKGDV(0xff); | ||
508 | regs->srgr1 |= CLKGDV(div - 1); | 515 | regs->srgr1 |= CLKGDV(div - 1); |
509 | 516 | ||
510 | return 0; | 517 | return 0; |
@@ -534,6 +541,8 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, | |||
534 | return -EINVAL; | 541 | return -EINVAL; |
535 | 542 | ||
536 | mcbsp_data->in_freq = freq; | 543 | mcbsp_data->in_freq = freq; |
544 | regs->srgr2 &= ~CLKSM; | ||
545 | regs->pcr0 &= ~SCLKME; | ||
537 | 546 | ||
538 | switch (clk_id) { | 547 | switch (clk_id) { |
539 | case OMAP_MCBSP_SYSCLK_CLK: | 548 | case OMAP_MCBSP_SYSCLK_CLK: |