linux-stable/sound
Pierre-Louis Bossart a8590dd73d
ASoC: rt711: enable pm_runtime in probe, keep status as 'suspended'
In stress cases involving module insertion/removal followed by
playback/capture, it can happen that capture/playback is started
before the codec enumeration completes.

The codec driver registers its components with the ASoC framework
during the probe stage, so there is currently no way for the card
creation to wait for the codec enumeration/initialization to complete.

In addition, when the capture/playback starts, the ASoC framework uses
pm_runtime_get_sync() to properly refcount and power-manage
devices. This is problematic in the SoundWire case because pm_runtime
is enabled during the enumeration/initialization stage, so
pm_runtime_get_sync() will return -EACCESS which is
ignored. Additional errors will happen when setting the pm_runtime
status as 'active' because the parent is not properly resumed,
resulting in an error such as:

"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 enabling pm_runtime during the probe, but marking
the device as 'active' only after it is enumerated. That will force a
dependency between the card and the codec, pm_runtime_get_sync() will
have to wait for the codec device to resume and hence implicitly wait
for the enumeration/initialization to be completed. In the nominal
case where the codec device is already active the get_sync() would
only perform a ref-count increase.

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>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20230802153629.53576-5-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2023-08-07 14:32:22 +01:00
..
ac97
aoa ALSA: Switch i2c drivers back to use .probe() 2023-06-05 09:22:45 +02:00
arm ARM: pxa: fix missing-prototypes warnings 2023-05-26 13:33:05 +02:00
atmel
core ALSA: seq: remove redundant unsigned comparison to zero 2023-07-21 13:02:16 +02:00
drivers ALSA: pcmtest: Don't use static storage to track per device data 2023-07-10 08:52:37 +02:00
firewire ALSA: fireface: make read-only const array for model names static 2023-06-28 11:42:55 +02:00
hda ALSA: hda: fix a possible null-pointer dereference due to data race in snd_hdac_regmap_sync() 2023-07-03 10:08:12 +02:00
i2c ALSA: i2c/cs8427: fix iec958 mixer control deactivation 2023-04-06 08:09:36 +02:00
isa Merge branch 'for-next' into for-linus 2023-06-26 15:23:23 +02:00
mips
oss
parisc
pci Linux 6.5-rc4 2023-07-30 23:38:02 +01:00
pcmcia ALSA: add HAS_IOPORT dependencies 2023-05-22 16:43:47 +02:00
ppc ALSA: Switch i2c drivers back to use .probe() 2023-06-05 09:22:45 +02:00
sh
soc ASoC: rt711: enable pm_runtime in probe, keep status as 'suspended' 2023-08-07 14:32:22 +01:00
sparc ALSA: sparc/dbri: Convert to platform remove callback returning void 2023-03-20 13:09:37 +00:00
spi
synth ALSA: emu10k1: fix synthesizer pitch for E-MU cards at 44.1 kHz 2023-06-13 07:42:08 +02:00
usb ALSA: usb-audio: Update for native DSD support quirks 2023-07-26 20:04:34 +02:00
virtio
x86
xen
ac97_bus.c
Kconfig ALSA: Enable build with UML 2023-07-18 15:19:01 +01:00
last.c
Makefile
sound_core.c sound: make all 'class' structures const 2023-06-21 07:29:10 +02:00