From: Greg Kroah-Hartman Date: Sat, 17 Dec 2011 00:03:13 +0000 (-0800) Subject: 3.0 patches X-Git-Tag: v3.0.14~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70d438fbb0935d1c13b6ccf8b9a343d325c46fba;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0 patches added patches: asoc-core-don-t-schedule-deferred_resume_work-twice.patch --- diff --git a/queue-3.0/asoc-core-don-t-schedule-deferred_resume_work-twice.patch b/queue-3.0/asoc-core-don-t-schedule-deferred_resume_work-twice.patch new file mode 100644 index 00000000000..5dbc98a5aa5 --- /dev/null +++ b/queue-3.0/asoc-core-don-t-schedule-deferred_resume_work-twice.patch @@ -0,0 +1,68 @@ +From 82e14e8bdd88b69018fe757192b01dd98582905e Mon Sep 17 00:00:00 2001 +From: Stephen Warren +Date: Wed, 25 May 2011 14:06:41 -0600 +Subject: ASoC: core: Don't schedule deferred_resume_work twice + +From: Stephen Warren + +commit 82e14e8bdd88b69018fe757192b01dd98582905e upstream. + +For cards that have two or more DAIs, snd_soc_resume's loop over all +DAIs ends up calling schedule_work(deferred_resume_work) once per DAI. +Since this is the same work item each time, the 2nd and subsequent +calls return 0 (work item already queued), and trigger the dev_err +message below stating that a work item may have been lost. + +Solve this by adjusting the loop to simply calculate whether to run the +resume work immediately or defer it, and then call schedule work (or not) +one time based on that. + +Note: This has not been tested in mainline, but only in chromeos-2.6.38; +mainline doesn't support suspend/resume on Tegra, nor does the mainline +Tegra ASoC driver contain multiple DAIs. It has been compile-checked in +mainline. + +Signed-off-by: Stephen Warren +Acked-by: Liam Girdwood +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/soc-core.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -1257,7 +1257,7 @@ static void soc_resume_deferred(struct w + int snd_soc_resume(struct device *dev) + { + struct snd_soc_card *card = dev_get_drvdata(dev); +- int i; ++ int i, ac97_control = 0; + + /* AC97 devices might have other drivers hanging off them so + * need to resume immediately. Other drivers don't have that +@@ -1266,14 +1266,15 @@ int snd_soc_resume(struct device *dev) + */ + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; +- if (cpu_dai->driver->ac97_control) { +- dev_dbg(dev, "Resuming AC97 immediately\n"); +- soc_resume_deferred(&card->deferred_resume_work); +- } else { +- dev_dbg(dev, "Scheduling resume work\n"); +- if (!schedule_work(&card->deferred_resume_work)) +- dev_err(dev, "resume work item may be lost\n"); +- } ++ ac97_control |= cpu_dai->driver->ac97_control; ++ } ++ if (ac97_control) { ++ dev_dbg(dev, "Resuming AC97 immediately\n"); ++ soc_resume_deferred(&card->deferred_resume_work); ++ } else { ++ dev_dbg(dev, "Scheduling resume work\n"); ++ if (!schedule_work(&card->deferred_resume_work)) ++ dev_err(dev, "resume work item may be lost\n"); + } + + return 0; diff --git a/queue-3.0/series b/queue-3.0/series index 95db881ca47..e38a8a2a246 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -43,3 +43,4 @@ ibft-fix-finding-ibft-acpi-table-on-uefi.patch usb-cdc-acm-add-ids-for-motorola-h24-hspa-usb-module.patch usb-option-add-huawei-e398-controlling-interfaces.patch usb-option-removing-one-bogus-and-adding-some-new-huawei-combinations.patch +asoc-core-don-t-schedule-deferred_resume_work-twice.patch