aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/davinci/davinci-mcasp.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 58fe112c5335..f390bb449c48 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -1003,13 +1003,31 @@ static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp,
1003 unsigned int bclk_freq, bool set) 1003 unsigned int bclk_freq, bool set)
1004{ 1004{
1005 int error_ppm; 1005 int error_ppm;
1006 int div = mcasp->sysclk_freq / bclk_freq; 1006 unsigned int sysclk_freq = mcasp->sysclk_freq;
1007 int rem = mcasp->sysclk_freq % bclk_freq; 1007 u32 reg = mcasp_get_reg(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG);
1008 int div = sysclk_freq / bclk_freq;
1009 int rem = sysclk_freq % bclk_freq;
1010 int aux_div = 1;
1011
1012 if (div > (ACLKXDIV_MASK + 1)) {
1013 if (reg & AHCLKXE) {
1014 aux_div = div / (ACLKXDIV_MASK + 1);
1015 if (div % (ACLKXDIV_MASK + 1))
1016 aux_div++;
1017
1018 sysclk_freq /= aux_div;
1019 div = sysclk_freq / bclk_freq;
1020 rem = sysclk_freq % bclk_freq;
1021 } else if (set) {
1022 dev_warn(mcasp->dev, "Too fast reference clock (%u)\n",
1023 sysclk_freq);
1024 }
1025 }
1008 1026
1009 if (rem != 0) { 1027 if (rem != 0) {
1010 if (div == 0 || 1028 if (div == 0 ||
1011 ((mcasp->sysclk_freq / div) - bclk_freq) > 1029 ((sysclk_freq / div) - bclk_freq) >
1012 (bclk_freq - (mcasp->sysclk_freq / (div+1)))) { 1030 (bclk_freq - (sysclk_freq / (div+1)))) {
1013 div++; 1031 div++;
1014 rem = rem - bclk_freq; 1032 rem = rem - bclk_freq;
1015 } 1033 }
@@ -1023,6 +1041,9 @@ static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp,
1023 error_ppm); 1041 error_ppm);
1024 1042
1025 __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_BCLK, div, 0); 1043 __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_BCLK, div, 0);
1044 if (reg & AHCLKXE)
1045 __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_AUXCLK,
1046 aux_div, 0);
1026 } 1047 }
1027 1048
1028 return error_ppm; 1049 return error_ppm;