aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/davinci/davinci-mcasp.c38
1 files changed, 19 insertions, 19 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 99061c4f3257..58fe112c5335 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -1000,9 +1000,9 @@ static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp,
1000} 1000}
1001 1001
1002static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp, 1002static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp,
1003 unsigned int bclk_freq, 1003 unsigned int bclk_freq, bool set)
1004 int *error_ppm)
1005{ 1004{
1005 int error_ppm;
1006 int div = mcasp->sysclk_freq / bclk_freq; 1006 int div = mcasp->sysclk_freq / bclk_freq;
1007 int rem = mcasp->sysclk_freq % bclk_freq; 1007 int rem = mcasp->sysclk_freq % bclk_freq;
1008 1008
@@ -1014,13 +1014,18 @@ static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp,
1014 rem = rem - bclk_freq; 1014 rem = rem - bclk_freq;
1015 } 1015 }
1016 } 1016 }
1017 if (error_ppm) 1017 error_ppm = (div*1000000 + (int)div64_long(1000000LL*rem,
1018 *error_ppm = 1018 (int)bclk_freq)) / div - 1000000;
1019 (div*1000000 + (int)div64_long(1000000LL*rem,
1020 (int)bclk_freq))
1021 /div - 1000000;
1022 1019
1023 return div; 1020 if (set) {
1021 if (error_ppm)
1022 dev_info(mcasp->dev, "Sample-rate is off by %d PPM\n",
1023 error_ppm);
1024
1025 __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_BCLK, div, 0);
1026 }
1027
1028 return error_ppm;
1024} 1029}
1025 1030
1026static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, 1031static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
@@ -1045,18 +1050,11 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
1045 int slots = mcasp->tdm_slots; 1050 int slots = mcasp->tdm_slots;
1046 int rate = params_rate(params); 1051 int rate = params_rate(params);
1047 int sbits = params_width(params); 1052 int sbits = params_width(params);
1048 int ppm, div;
1049 1053
1050 if (mcasp->slot_width) 1054 if (mcasp->slot_width)
1051 sbits = mcasp->slot_width; 1055 sbits = mcasp->slot_width;
1052 1056
1053 div = davinci_mcasp_calc_clk_div(mcasp, rate*sbits*slots, 1057 davinci_mcasp_calc_clk_div(mcasp, rate * sbits * slots, true);
1054 &ppm);
1055 if (ppm)
1056 dev_info(mcasp->dev, "Sample-rate is off by %d PPM\n",
1057 ppm);
1058
1059 __davinci_mcasp_set_clkdiv(mcasp, 1, div, 0);
1060 } 1058 }
1061 1059
1062 ret = mcasp_common_hw_param(mcasp, substream->stream, 1060 ret = mcasp_common_hw_param(mcasp, substream->stream,
@@ -1167,7 +1165,8 @@ static int davinci_mcasp_hw_rule_rate(struct snd_pcm_hw_params *params,
1167 davinci_mcasp_dai_rates[i]; 1165 davinci_mcasp_dai_rates[i];
1168 int ppm; 1166 int ppm;
1169 1167
1170 davinci_mcasp_calc_clk_div(rd->mcasp, bclk_freq, &ppm); 1168 ppm = davinci_mcasp_calc_clk_div(rd->mcasp, bclk_freq,
1169 false);
1171 if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) { 1170 if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) {
1172 if (range.empty) { 1171 if (range.empty) {
1173 range.min = davinci_mcasp_dai_rates[i]; 1172 range.min = davinci_mcasp_dai_rates[i];
@@ -1206,8 +1205,9 @@ static int davinci_mcasp_hw_rule_format(struct snd_pcm_hw_params *params,
1206 if (rd->mcasp->slot_width) 1205 if (rd->mcasp->slot_width)
1207 sbits = rd->mcasp->slot_width; 1206 sbits = rd->mcasp->slot_width;
1208 1207
1209 davinci_mcasp_calc_clk_div(rd->mcasp, sbits*slots*rate, 1208 ppm = davinci_mcasp_calc_clk_div(rd->mcasp,
1210 &ppm); 1209 sbits * slots * rate,
1210 false);
1211 if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) { 1211 if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) {
1212 snd_mask_set(&nfmt, i); 1212 snd_mask_set(&nfmt, i);
1213 count++; 1213 count++;