[alsa-devel] [PATCH] ASoC: remove a card from the list, if instantiation failed
broonie at opensource.wolfsonmicro.com
Thu Mar 18 00:36:30 CET 2010
On 17 Mar 2010, at 23:09, Guennadi Liakhovetski
<g.liakhovetski at gmx.de> wrote:
> 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
>>> list. This fixes an Oops on Migo-R, triggering, when after a failed
>>> firmware load attempt the driver modules are removed and re-inserted
>> 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
>> 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
> the soc-audio platform device, snd_soc_unregister_card() is called,
> since instantiated is not set, nothing is done and the card stays on
> list. What's the proper unwind way in such a case then?
The card should be removed on unregistration either way.
>>> 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
>>> list_add(&card->list, &card_list);
>>> + if (!card->instantiated)
>>> + list_del(&card->list);
>>> 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