ASoC: es8316: Do not set rate constraints for unsupported MCLKs
[ Upstream commit60413129ee
] When using the codec through the generic audio graph card, there are at least two calls of es8316_set_dai_sysclk(), with the effect of limiting the allowed sample rates according to the MCLK/LRCK ratios supported by the codec: 1. During audio card setup, to set the initial MCLK - see asoc_simple_init_dai(). 2. Before opening a stream, to update MCLK, according to the stream sample rate and the multiplication factor - see asoc_simple_hw_params(). In some cases the initial MCLK might be set to a frequency that doesn't match any of the supported ratios, e.g. 12287999 instead of 12288000, which is only 1 Hz below the supported clock, as that is what the hardware reports. This creates an empty list of rate constraints, which is further passed to snd_pcm_hw_constraint_list() via es8316_pcm_startup(), and causes the following error on the very first access of the sound card: $ speaker-test -D hw:Analog,0 -F S16_LE -c 2 -t wav Broken configuration for playback: no configurations available: Invalid argument Setting of hwparams failed: Invalid argument Note that all subsequent retries succeed thanks to the updated MCLK set at point 2 above, which uses a computed frequency value instead of a reading from the hardware registers. Normally this would have mitigated the issue, but es8316_pcm_startup() executes before the 2nd call to es8316_set_dai_sysclk(), hence it cannot make use of the updated constraints. Since es8316_pcm_hw_params() performs anyway a final validation of MCLK against the stream sample rate and the supported MCLK/LRCK ratios, fix the issue by ensuring that sysclk_constraints list is only set when at least one supported sample rate is autodetected by the codec. Fixes:b8b88b7087
("ASoC: add es8316 codec driver") Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com> Link: https://lore.kernel.org/r/20230530181140.483936-3-cristian.ciocaltea@collabora.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3b575d9302
commit
863054be8d
|
@ -369,13 +369,11 @@ static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
|||
int count = 0;
|
||||
|
||||
es8316->sysclk = freq;
|
||||
es8316->sysclk_constraints.list = NULL;
|
||||
es8316->sysclk_constraints.count = 0;
|
||||
|
||||
if (freq == 0) {
|
||||
es8316->sysclk_constraints.list = NULL;
|
||||
es8316->sysclk_constraints.count = 0;
|
||||
|
||||
if (freq == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = clk_set_rate(es8316->mclk, freq);
|
||||
if (ret)
|
||||
|
@ -391,8 +389,10 @@ static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
|||
es8316->allowed_rates[count++] = freq / ratio;
|
||||
}
|
||||
|
||||
es8316->sysclk_constraints.list = es8316->allowed_rates;
|
||||
es8316->sysclk_constraints.count = count;
|
||||
if (count) {
|
||||
es8316->sysclk_constraints.list = es8316->allowed_rates;
|
||||
es8316->sysclk_constraints.count = count;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue