ASoC: soc-pcm: fixup snd_pcm_limit_hw_rates() timing
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 22 Jan 2021 01:13:53 +0000 (10:13 +0900)
committerMark Brown <broonie@kernel.org>
Wed, 3 Feb 2021 17:41:43 +0000 (17:41 +0000)
commitdd5abc7834ffae1ca6c399583353e00886817181
tree00ae833edd20a4ecf158cf101964d476ae8249db
parent4b260f425497b105acc2baa9d97ef781ef0c667d
ASoC: soc-pcm: fixup snd_pcm_limit_hw_rates() timing

soc-pcm has snd_pcm_limit_hw_rates() which determine rate_min/rate_max.
It updates runtime->hw.rate_min/max (A) based on hw->rates (B).

int snd_pcm_limit_hw_rates(...)
{
int i;
for (...) {
(B) if (runtime->hw.rates & (1 << i)) {
(A) runtime->hw.rate_min = ...
break;
}
}
for (...) {
(B) if (runtime->hw.rates & (1 << i)) {
(A) runtime->hw.rate_max = ...
break;
}
}
return 0;
}

This means, setup order is

1) set hw->rates
2) call snd_pcm_limit_hw_rates()
3) update hw->rate_min/max

soc_pcm_init_runtime_hw() is calling it in good order

static void soc_pcm_init_runtime_hw(xxx)
{
...
1) hw->rates = snd_pcm_rate_mask_intersect(...);

2) snd_pcm_limit_hw_rates(...);

3) hw->rate_min = max(...);
hw->rate_min = max(...);
hw->rate_max = min_not_zero(...);
hw->rate_max = min_not_zero(...);
}

But, dpcm_fe_dai_startup() is not.

static int dpcm_fe_dai_startup(xxx)
{
...
1) 3) dpcm_set_fe_runtime(...);
2) snd_pcm_limit_hw_rates(...);
...
}

More detail of dpcm_set_fe_runtime() is

static void dpcm_set_fe_runtime()
{
...
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
...

3) 1) dpcm_init_runtime_hw(...);
}
...
3) 1) dpcm_runtime_merge_rate(...);
}

This patch fixup these into

static void dpcm_set_fe_runtime()
{
...
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
...

1) 2) 3) dpcm_init_runtime_hw(...);
}
...
1) 2) 3) dpcm_runtime_merge_rate(...);
}

static int dpcm_fe_dai_startup(xxx)
{
...
dpcm_set_fe_runtime(...);
- snd_pcm_limit_hw_rates(...);
...
}

Link: https://lore.kernel.org/r/87k15l7ewd.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/8735ytaig8.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-pcm.c