soundwire: intel: fix race condition on system resume
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 17 Aug 2020 15:29:14 +0000 (23:29 +0800)
committerVinod Koul <vkoul@kernel.org>
Tue, 18 Aug 2020 06:31:04 +0000 (12:01 +0530)
Previous patches took care of the case where the master device is
pm_runtime 'suspended' when a system suspend occurs.

In the case where the master device was not suspended, e.g. if suspend
occurred while streaming audio, Intel validation noticed a race
condition: the pm_runtime suspend may conflict with the enumeration
started by the system resume.

This can be simply fixed by updating the status before exiting system
resume.

GitHub issue: https://github.com/thesofproject/linux/issues/1482
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20200817152923.3259-4-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/intel.c

index 0e21bae..00c5de1 100644 (file)
@@ -1528,6 +1528,18 @@ static int intel_resume(struct device *dev)
                return ret;
        }
 
+       /*
+        * after system resume, the pm_runtime suspend() may kick in
+        * during the enumeration, before any children device force the
+        * master device to remain active.  Using pm_runtime_get()
+        * routines is not really possible, since it'd prevent the
+        * master from suspending.
+        * A reasonable compromise is to update the pm_runtime
+        * counters and delay the pm_runtime suspend by several
+        * seconds, by when all enumeration should be complete.
+        */
+       pm_runtime_mark_last_busy(dev);
+
        return ret;
 }