Browse Source

MLK-10048-5: ASoC: fsl_asrc: underrun for playback 192k, 6ch p2p case.

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>
isee-imx_3.14.28.y
Shengjiu Wang 6 years ago
committed by Nitin Garg
parent
commit
bd86f55970
3 changed files with 25 additions and 12 deletions
  1. +23
    -10
      sound/soc/fsl/fsl_asrc.c
  2. +1
    -1
      sound/soc/fsl/fsl_asrc.h
  3. +1
    -1
      sound/soc/fsl/fsl_asrc_m2m.c

+ 23
- 10
sound/soc/fsl/fsl_asrc.c View 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;


+ 1
- 1
sound/soc/fsl/fsl_asrc.h View 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


+ 1
- 1
sound/soc/fsl/fsl_asrc_m2m.c View 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;


Loading…
Cancel
Save