|
@@ -767,11 +767,21 @@ static int soc_resume(struct platform_device *pdev)
|
|
|
{
|
|
|
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
|
|
|
struct snd_soc_card *card = socdev->card;
|
|
|
+ struct snd_soc_dai *cpu_dai = card->dai_link[0].cpu_dai;
|
|
|
|
|
|
- dev_dbg(socdev->dev, "scheduling resume work\n");
|
|
|
-
|
|
|
- if (!schedule_work(&card->deferred_resume_work))
|
|
|
- dev_err(socdev->dev, "resume work item may be lost\n");
|
|
|
+ /* 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
|
|
|
+ * due to I/O costs and anti-pop so handle them out of line.
|
|
|
+ */
|
|
|
+ if (cpu_dai->ac97_control) {
|
|
|
+ dev_dbg(socdev->dev, "Resuming AC97 immediately\n");
|
|
|
+ soc_resume_deferred(&card->deferred_resume_work);
|
|
|
+ } else {
|
|
|
+ dev_dbg(socdev->dev, "Scheduling resume work\n");
|
|
|
+ if (!schedule_work(&card->deferred_resume_work))
|
|
|
+ dev_err(socdev->dev, "resume work item may be lost\n");
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|