Message ID | 20230803065220.3823269-3-yung-chuan.liao@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | soundwire: improve pm_runtime handling | expand |
On Thu, Aug 03, 2023 at 02:52:20PM +0800, Bard Liao wrote: > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > > The SoundWire bus is handled with a dedicated device, which is placed > between the Intel auxiliary device and peripheral devices, e.g. > > soundwire_intel.link.0/sdw-master-0/sdw:0:025d:0711:01 > > The functionality of this 'sdw-master' device is limited, specifically > for pm_runtime the ASoC framework will not rely on > pm_runtime_get_sync() since it does not register any components. It > will only change status thanks to the parent-child relationship which > guarantees that the 'sdw-master' device will be pm_runtime resumed > before any peripheral device. > > However on startup and system resume it's possible that only the > auxiliary device is pm_runtime active, and the peripheral will only > become active during its io_init routine, leading to another > occurrence of the error reported by the pm_runtime framework: > > rt711 sdw:0:025d:0711:00: runtime PM trying to activate child device > sdw:0:025d:0711:00 but parent (sdw-master-0) is not active > > This patch suggests aligning the sdw-master device status to that of > the auxiliary device. The difference between the two is completely > notional and their pm_status shouldn't be different during the startup > and system resume steps. > > This problem was exposed by recent changes in the timing of the bus > reset, but was present in this driver since we introduced pm_runtime > support. > > Closes: https://github.com/thesofproject/linux/issues/4328 > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> > Reviewed-by: Rander Wang <rander.wang@intel.com> > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> > --- Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com> Thanks, Charles
diff --git a/drivers/soundwire/intel_auxdevice.c b/drivers/soundwire/intel_auxdevice.c index f51c776eeeff..91c86b46a5a1 100644 --- a/drivers/soundwire/intel_auxdevice.c +++ b/drivers/soundwire/intel_auxdevice.c @@ -257,6 +257,8 @@ int intel_link_startup(struct auxiliary_device *auxdev) pm_runtime_set_active(dev); pm_runtime_enable(dev); + + pm_runtime_resume(bus->dev); } /* start bus */ @@ -294,6 +296,7 @@ int intel_link_startup(struct auxiliary_device *auxdev) * definition of Master properties. */ if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME_IDLE)) { + pm_runtime_mark_last_busy(bus->dev); pm_runtime_mark_last_busy(dev); pm_runtime_idle(dev); } @@ -557,6 +560,8 @@ static int __maybe_unused intel_resume(struct device *dev) pm_runtime_mark_last_busy(dev); pm_runtime_enable(dev); + pm_runtime_resume(bus->dev); + link_flags = md_flags >> (bus->link_id * 8); if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME_IDLE)) @@ -592,6 +597,7 @@ static int __maybe_unused intel_resume(struct device *dev) * counters and delay the pm_runtime suspend by several * seconds, by when all enumeration should be complete. */ + pm_runtime_mark_last_busy(bus->dev); pm_runtime_mark_last_busy(dev); return 0;