aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2014-01-27 10:37:52 -0500
committerMark Brown <broonie@linaro.org>2014-01-27 15:45:57 -0500
commitab8b14b6d841b314434f5817c107572f923fc43d (patch)
tree7f2b28b7b556683074355e71386069883a46eed9
parent5ad8865b009bc8ad35adcbcb60c0679d437e8036 (diff)
ASoC: davinci-mcasp: Set BCLK divider if McASP is BCLK master
Make BCLK divider setting implicite in hw_params call if McASP device is the bit clock master on the audio serial bus. Signed-off-by: Jyri Sarha <jsarha@ti.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/davinci/davinci-mcasp.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index b7858bfa0295..ae328beb676a 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -53,6 +53,9 @@ struct davinci_mcasp {
53 u16 bclk_lrclk_ratio; 53 u16 bclk_lrclk_ratio;
54 int streams; 54 int streams;
55 55
56 int sysclk_freq;
57 bool bclk_master;
58
56 /* McASP FIFO related */ 59 /* McASP FIFO related */
57 u8 txnumevt; 60 u8 txnumevt;
58 u8 rxnumevt; 61 u8 rxnumevt;
@@ -292,6 +295,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
292 295
293 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR); 296 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
294 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR); 297 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
298 mcasp->bclk_master = 1;
295 break; 299 break;
296 case SND_SOC_DAIFMT_CBM_CFS: 300 case SND_SOC_DAIFMT_CBM_CFS:
297 /* codec is clock master and frame slave */ 301 /* codec is clock master and frame slave */
@@ -303,6 +307,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
303 307
304 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR); 308 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
305 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR); 309 mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
310 mcasp->bclk_master = 0;
306 break; 311 break;
307 case SND_SOC_DAIFMT_CBM_CFM: 312 case SND_SOC_DAIFMT_CBM_CFM:
308 /* codec is clock and frame master */ 313 /* codec is clock and frame master */
@@ -314,6 +319,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
314 319
315 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, 320 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
316 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR); 321 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
322 mcasp->bclk_master = 0;
317 break; 323 break;
318 324
319 default: 325 default:
@@ -405,6 +411,8 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
405 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX); 411 mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
406 } 412 }
407 413
414 mcasp->sysclk_freq = freq;
415
408 return 0; 416 return 0;
409} 417}
410 418
@@ -607,6 +615,18 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
607 int channels; 615 int channels;
608 struct snd_interval *pcm_channels = hw_param_interval(params, 616 struct snd_interval *pcm_channels = hw_param_interval(params,
609 SNDRV_PCM_HW_PARAM_CHANNELS); 617 SNDRV_PCM_HW_PARAM_CHANNELS);
618
619 /* If mcasp is BCLK master we need to set BCLK divider */
620 if (mcasp->bclk_master) {
621 unsigned int bclk_freq = snd_soc_params_to_bclk(params);
622 if (mcasp->sysclk_freq % bclk_freq != 0) {
623 dev_err(mcasp->dev, "Can't produce requred BCLK\n");
624 return -EINVAL;
625 }
626 davinci_mcasp_set_clkdiv(
627 cpu_dai, 1, mcasp->sysclk_freq / bclk_freq);
628 }
629
610 channels = pcm_channels->min; 630 channels = pcm_channels->min;
611 631
612 active_serializers = (channels + slots - 1) / slots; 632 active_serializers = (channels + slots - 1) / slots;