diff options
author | Jyri Sarha <jsarha@ti.com> | 2014-01-27 10:37:52 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-01-27 15:45:57 -0500 |
commit | ab8b14b6d841b314434f5817c107572f923fc43d (patch) | |
tree | 7f2b28b7b556683074355e71386069883a46eed9 | |
parent | 5ad8865b009bc8ad35adcbcb60c0679d437e8036 (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.c | 20 |
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; |