ASoC: core: Don't schedule deferred_resume_work twice
authorStephen Warren <swarren@nvidia.com>
Sat, 11 Jun 2011 03:15:21 +0000 (20:15 -0700)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 20:08:53 +0000 (12:08 -0800)
commit9bc580859f4b5ab2ce5a272795a3eaf00526473f
tree4b8943088d8f3360b1eb52e26119b4a9ebc71263
parent1ea2351842fa88f9a15d6cfe44e1439f30fe5ac5
ASoC: core: Don't schedule deferred_resume_work twice

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 <swarren@nvidia.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Change-Id: I9c29b6c310a94108d81ab6506eb64ee9f30d846a
Signed-off-by: Todd Poynor <toddpoynor@google.com>
sound/soc/soc-core.c