提交 82e14e8b 编写于 作者: S Stephen Warren 提交者: Mark Brown

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: NStephen Warren <swarren@nvidia.com>
Acked-by: NLiam Girdwood <lrg@ti.com>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 b6f7d7c8
...@@ -1256,7 +1256,7 @@ static void soc_resume_deferred(struct work_struct *work) ...@@ -1256,7 +1256,7 @@ static void soc_resume_deferred(struct work_struct *work)
int snd_soc_resume(struct device *dev) int snd_soc_resume(struct device *dev)
{ {
struct snd_soc_card *card = dev_get_drvdata(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 /* AC97 devices might have other drivers hanging off them so
* need to resume immediately. Other drivers don't have that * need to resume immediately. Other drivers don't have that
...@@ -1265,14 +1265,15 @@ int snd_soc_resume(struct device *dev) ...@@ -1265,14 +1265,15 @@ int snd_soc_resume(struct device *dev)
*/ */
for (i = 0; i < card->num_rtd; i++) { for (i = 0; i < card->num_rtd; i++) {
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
if (cpu_dai->driver->ac97_control) { ac97_control |= cpu_dai->driver->ac97_control;
dev_dbg(dev, "Resuming AC97 immediately\n"); }
soc_resume_deferred(&card->deferred_resume_work); if (ac97_control) {
} else { dev_dbg(dev, "Resuming AC97 immediately\n");
dev_dbg(dev, "Scheduling resume work\n"); soc_resume_deferred(&card->deferred_resume_work);
if (!schedule_work(&card->deferred_resume_work)) } else {
dev_err(dev, "resume work item may be lost\n"); 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; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册