]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
MLK-10048-5: ASoC: fsl_asrc: underrun for playback 192k, 6ch p2p case.
authorShengjiu Wang <shengjiu.wang@freescale.com>
Mon, 8 Dec 2014 07:20:41 +0000 (15:20 +0800)
committerNitin Garg <nitin.garg@freescale.com>
Fri, 16 Jan 2015 03:18:52 +0000 (21:18 -0600)
For p2p output, the output divider should align with the output sample
rate, if use the Ideal sample rate, there will be a lot of overload, which
will cause underrun.

Signed-off-by: Shengjiu Wang <shengjiu.wang@freescale.com>
sound/soc/fsl/fsl_asrc.c
sound/soc/fsl/fsl_asrc.h
sound/soc/fsl/fsl_asrc_m2m.c

index 3c2c69c78ebd39f4f183105a869f5212fd6efbbe..23a7119c1f137381fa6a98fae59ec71ea08b5e0a 100644 (file)
@@ -236,7 +236,7 @@ static int fsl_asrc_set_ideal_ratio(struct fsl_asrc_pair *pair,
  * of struct asrc_config which includes in/output sample rate, width, channel
  * and clock settings.
  */
-static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair)
+static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair, bool p2p_in, bool p2p_out)
 {
        struct asrc_config *config = pair->config;
        struct fsl_asrc *asrc_priv = pair->asrc_priv;
@@ -303,11 +303,17 @@ static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair)
 
        clk = asrc_priv->asrck_clk[clk_index[OUT]];
 
-       /* Use fixed output rate for Ideal Ratio mode (INCLK_NONE) */
-       if (ideal)
-               div[OUT] = clk_get_rate(clk) / IDEAL_RATIO_RATE;
-       else
+       /*
+        * When P2P mode, output rate should align with the out samplerate.
+        * if set too high output rate, there will be lots of Overload.
+        * When M2M mode, output rate should also need to align with the out
+        * samplerate, but M2M must use less time to achieve good performance.
+        */
+       if (p2p_out)
                div[OUT] = clk_get_rate(clk) / outrate;
+       else
+               div[OUT] = clk_get_rate(clk) / IDEAL_RATIO_RATE;
+
 
        if (div[OUT] == 0) {
                pair_err("failed to support output sample rate %dHz by asrck_%x\n",
@@ -484,17 +490,24 @@ static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,
                config.output_word_width  = word_width;
                config.input_sample_rate  = rate;
                config.output_sample_rate = asrc_priv->asrc_rate;
+
+               ret = fsl_asrc_config_pair(pair, false, true);
+               if (ret) {
+                       dev_err(dai->dev, "fail to config asrc pair\n");
+                       return ret;
+               }
+
        } else {
                config.input_word_width   = word_width;
                config.output_word_width  = width;
                config.input_sample_rate  = asrc_priv->asrc_rate;
                config.output_sample_rate = rate;
-       }
 
-       ret = fsl_asrc_config_pair(pair);
-       if (ret) {
-               dev_err(dai->dev, "fail to config asrc pair\n");
-               return ret;
+               ret = fsl_asrc_config_pair(pair, true, false);
+               if (ret) {
+                       dev_err(dai->dev, "fail to config asrc pair\n");
+                       return ret;
+               }
        }
 
        return 0;
index 79473b6b04b9b4d3ec5c555cef7b9505edd7f8b7..4c9ca0fea88e25e2a14bf7edc71897b4e37badf9 100644 (file)
@@ -28,7 +28,7 @@
 #define ASRC_OUTPUT_LAST_SAMPLE_MAX    32
 #define ASRC_OUTPUT_LAST_SAMPLE                16
 
-#define IDEAL_RATIO_RATE               1000000
+#define IDEAL_RATIO_RATE               200000
 
 #define REG_ASRCTR                     0x00
 #define REG_ASRIER                     0x04
index 1ae6aa7b739b9742452038c45e35bb4c20228cd8..e3b57278b43cf103492d882ce432e25692f5e279 100644 (file)
@@ -538,7 +538,7 @@ static long fsl_asrc_ioctl_config_pair(struct fsl_asrc_pair *pair,
        index = config.pair;
 
        pair->config = &config;
-       ret = fsl_asrc_config_pair(pair);
+       ret = fsl_asrc_config_pair(pair, false, false);
        if (ret) {
                pair_err("failed to config pair: %ld\n", ret);
                return ret;