[alsa-devel] [PATCH][RFC] ASoC: soc-dpm: fixup DAI active unbalance

Vinod Koul vkoul at kernel.org
Fri May 17 05:38:18 CEST 2019


On 16-05-19, 22:21, Pierre-Louis Bossart wrote:
> On 5/16/19 8:21 PM, Kuninori Morimoto wrote:
> > From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> > 
> > snd_soc_dai_link_event() is updating snd_soc_dai :: active,
> > but it is unbalance.
> > It counts up if it has startup callback.
> > 
> > 	case SND_SOC_DAPM_PRE_PMU:
> > 		...
> > 		snd_soc_dapm_widget_for_each_source_path(w, path) {
> > 			...
> > 			if (source->driver->ops->startup) {
> > 				...
> > =>				source->active++;
> > 			}
> > 			...
> > 		}
> > 		...
> > 
> > But, always counts down
> > 
> > 	case SND_SOC_DAPM_PRE_PMD:
> > 		...
> > 		snd_soc_dapm_widget_for_each_source_path(w, path) {
> > 			...
> > =>			source->active--;
> > 			...
> > 		}
> > 
> > This patch always counts up when SND_SOC_DAPM_PRE_PMD.
> > 
> > Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> > ---
> > Mark, Liam
> > 
> > I think this is bug, but I can't confirm it,
> > because my driver need to have .startup.
> > Thus, I added [RFC] on this patch.
> > I'm happy if someone can confirm it.

Right, seems a bug to me!

> This looks like a bug since the initial Intel contribution in 2015.
> 9b8ef9f6b3fc ('ASoC: dapm: Add startup & shutdown for dai_links') already
> has this imbalance.

Well yes this would be seen if someone has a dai_link without the
startup and shutdown calls (which is not mandatory). Agreed that it was
a miss to not put counters in right places.
> 
> I don't have a clue why this is not symmetric or not done as suggested by
> Morimoto-san. Vinod, any idea?

Since while testing we always had the calls and never run in imbalance,
but we should have done better!

I think you should be able to test it on Intel platforms with dai_links
and removing the optional calls.

The change looks fine to be

Reviewed-by: Vinod Koul <vkoul at kernel.org>

> >   sound/soc/soc-dapm.c | 4 ++--
> >   1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> > index c864502..147ad9d 100644
> > --- a/sound/soc/soc-dapm.c
> > +++ b/sound/soc/soc-dapm.c
> > @@ -3828,8 +3828,8 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
> >   						ret);
> >   					goto out;
> >   				}
> > -				source->active++;
> >   			}
> > +			source->active++;
> >   			ret = soc_dai_hw_params(&substream, params, source);
> >   			if (ret < 0)
> >   				goto out;
> > @@ -3850,8 +3850,8 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
> >   						ret);
> >   					goto out;
> >   				}
> > -				sink->active++;
> >   			}
> > +			sink->active++;
> >   			ret = soc_dai_hw_params(&substream, params, sink);
> >   			if (ret < 0)
> >   				goto out;
> > 

-- 
~Vinod


More information about the Alsa-devel mailing list