ASoC: davinci-macsp: Optimize implicit BLCK sample-rate rule
authorJyri Sarha <jsarha@ti.com>
Thu, 23 Apr 2015 13:16:06 +0000 (16:16 +0300)
committerMark Brown <broonie@kernel.org>
Thu, 30 Apr 2015 19:47:16 +0000 (20:47 +0100)
There is no need to copy the list of all supported sample-rates.
Finding the supported endpoints within the current range is enough
(see snd_interval_list()).

Signed-off-by: Jyri Sarha <jsarha@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/davinci/davinci-mcasp.c

index f841707..56da8ce 100644 (file)
@@ -1023,27 +1023,35 @@ static int davinci_mcasp_hw_rule_rate(struct snd_pcm_hw_params *params,
                hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
        int sbits = params_width(params);
        int slots = rd->mcasp->tdm_slots;
-       unsigned int list[ARRAY_SIZE(davinci_mcasp_dai_rates)];
-       int i, count = 0;
+       struct snd_interval range;
+       int i;
+
+       snd_interval_any(&range);
+       range.empty = 1;
 
        for (i = 0; i < ARRAY_SIZE(davinci_mcasp_dai_rates); i++) {
-               if (ri->min <= davinci_mcasp_dai_rates[i] &&
-                   ri->max >= davinci_mcasp_dai_rates[i]) {
+               if (snd_interval_test(ri, davinci_mcasp_dai_rates[i])) {
                        uint bclk_freq = sbits*slots*
                                davinci_mcasp_dai_rates[i];
                        int ppm;
 
                        davinci_mcasp_calc_clk_div(rd->mcasp, bclk_freq, &ppm);
-                       if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM)
-                               list[count++] = davinci_mcasp_dai_rates[i];
+                       if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) {
+                               if (range.empty) {
+                                       range.min = davinci_mcasp_dai_rates[i];
+                                       range.empty = 0;
+                               }
+                               range.max = davinci_mcasp_dai_rates[i];
+                       }
                }
        }
+
        dev_dbg(rd->mcasp->dev,
-               "%d frequencies (%d-%d) for %d sbits and %d tdm slots\n",
-               count, ri->min, ri->max, sbits, slots);
+               "Frequencies %d-%d -> %d-%d for %d sbits and %d tdm slots\n",
+               ri->min, ri->max, range.min, range.max, sbits, slots);
 
-       return snd_interval_list(hw_param_interval(params, rule->var),
-                                count, list, 0);
+       return snd_interval_refine(hw_param_interval(params, rule->var),
+                                  &range);
 }
 
 static int davinci_mcasp_hw_rule_format(struct snd_pcm_hw_params *params,