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++; |
