diff options
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 38 |
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 | ||
1002 | static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp, | 1002 | static 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 | ||
1026 | static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | 1031 | static 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++; |