The code tries to schedule a work item from the resume context, which will crash the kernel if snd_soc_instantiate_card() has not been called for the card before.
The bug I triggered is related to 82e14e8b ("ASoC: core: Don't schedule deferred_resume_work twice"), hence a backport to 3.1 is necessary.
Signed-off-by: Daniel Mack zonque@gmail.com Cc: Liam Girdwood lrg@ti.com Cc: Mark Brown broonie@opensource.wolfsonmicro.com Cc: Stephen Warren swarren@nvidia.com Cc: stable@kernel.org [v3.1] --- sound/soc/soc-core.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index a5d3685..721f16e 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -709,6 +709,9 @@ int snd_soc_resume(struct device *dev) struct snd_soc_card *card = dev_get_drvdata(dev); int i, ac97_control = 0;
+ if (!card->instantiated) + return 0; + /* AC97 devices might have other drivers hanging off them so * need to resume immediately. Other drivers don't have that * problem and may take a substantial amount of time to resume