[alsa-devel] [PATCH] ASoC: remove a card from the list, if instantiation failed
g.liakhovetski at gmx.de
Thu Mar 18 00:09:51 CET 2010
On Wed, 17 Mar 2010, Mark Brown wrote:
> On 17 Mar 2010, at 21:06, Guennadi Liakhovetski <g.liakhovetski at gmx.de> wrote:
> > If instantiation of a card failed, we have to remove it from the card
> > list. This fixes an Oops on Migo-R, triggering, when after a failed
> > firmware load attempt the driver modules are removed and re-inserted
> > again.
> This looks like the wrong fix - if the card failed to instantiate because the
> component drivers weren't ready then it ought to hang around so it can be
> instantiated once they appear. Presumably some part of the instantiation
> attempt is failing and not being unwound properly?
If snd_soc_instantiate_card() fails, when called from
snd_soc_register_card(), the card currently stays on the list, but the
instantiated flag is not set. If you then unload drivers and unregister
the soc-audio platform device, snd_soc_unregister_card() is called, but
since instantiated is not set, nothing is done and the card stays on the
list. What's the proper unwind way in such a case then?
> > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski at gmx.de>
> > ---
> > Should also be good for stable.
> > diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> > index c8b0556..307eea0 100644
> > --- a/sound/soc/soc-core.c
> > +++ b/sound/soc/soc-core.c
> > @@ -2361,6 +2361,8 @@ static int snd_soc_register_card(struct snd_soc_card
> > *card)
> > mutex_lock(&client_mutex);
> > list_add(&card->list, &card_list);
> > snd_soc_instantiate_cards();
> > + if (!card->instantiated)
> > + list_del(&card->list);
> > mutex_unlock(&client_mutex);
> > dev_dbg(card->dev, "Registered card '%s'\n", card->name);
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
More information about the Alsa-devel