Commit bd86f559 by Shengjiu Wang Committed by Nitin Garg

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: 's avatarShengjiu Wang <shengjiu.wang@freescale.com>
parent a73b35be
......@@ -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;
......
......@@ -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
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment