Unable to open hostless PCM device after introduction of commit - ASoC: Stop dummy from overriding hwparams
Amadeusz Sławiński
amadeuszx.slawinski at linux.intel.com
Mon Nov 21 16:29:19 CET 2022
On 11/18/2022 6:17 PM, Patrick Lai wrote:
> Hi Amadeusz,
>
> On the product I am working on, a hostless PCM device is defined for
> purpose of activating CODEC driver to setup the path inside CODEC. So,
> CPU DAI and PCM Platform are defined to use dummy dai & DMA supplied by
> sound/soc/soc-utils.c.
>
> After upgrading to newer kernel, hostless PCM device failed to open.
> After doing a bit of digging, the root cause is that dummy_dma_hardware
> is not set in dummy_dma_open() due to new conditional check logic
> introduced in this commit - 6c504663ba2ee2abeaf5622e27082819326c1bd4.
>
> In order to fix problem I am encountering properly without regressing
> your scenario, I would like to get a better understanding of problem you
> were addressing. My understanding, from looking through other drivers
> under sound/soc, is that pcm hardware info is usually set by PCM
> platform/DMA drivers. For your scenario, do you have other component e.g
> CPU/CODEC DAI, set PCM hardware definition? I am not sure conditional
> check logic from 6c504663ba2ee2abeaf5622e27082819326c1bd4 guarantees
> that other component would be setting pcm hardware info. Appreciate if
> you can provide more insight to your scenario?
>
> Thanks
> Patrick
Hi Patrick,
Call path is: ... -> __soc_pcm_open() -> soc_pcm_components_open ->
snd_soc_component_open -> open callback, where for dummy device open
callback is dummy_dma_open.
Expanding on the issue in question which was cause of the patch.
With following debug log:
diff --git a/sound/soc/soc-component.c b/sound/soc/soc-component.c
index e12f8244242b..b086ec05da25 100644
--- a/sound/soc/soc-component.c
+++ b/sound/soc/soc-component.c
@@ -290,6 +290,8 @@ int snd_soc_component_open(struct snd_soc_component
*component,
{
int ret = 0;
+ pr_err("%s\n", component->name);
+
if (component->driver->open)
ret = component->driver->open(component, substream);
that's what I get in dmesg on one of our test platforms:
[ 95.522577] avs_rt274.1-platform
[ 95.526019] i2c-INT34C2:00
[ 95.528837] snd_soc_core:dpcm_fe_dai_startup: audio: ASoC: open FE audio
[ 95.528849] avs_rt274.1-platform
[ 95.532249] snd-soc-dummy
[ 95.534989] snd-soc-dummy
[ 95.537800] snd_soc_avs:avs_dai_fe_startup: snd_soc_avs 0000:00:1f.3:
avs_dai_fe_startup fe STARTUP tag 1 str 0000000064defd29
"avs_rt274.1-platform" component is handled in sound/soc/intel/avs/pcm.c
it calls avs_component_open() which sets hwparams to generic set
supported by i2s devices in AVS driver.
"i2c-INT34C2:00" is codec driver sound/soc/codecs/rt274.c it does not
have open callback.
And finally "snd-soc-dummy" which as mentioned above calls
dummy_dma_open which originally overridden hwparams set in
avs_component_open() with its own limited ones.
(When topology is loaded it also creates FEs, which further limit
allowed hwparams, they are a subset of the ones set above).
As mentioned in the patch:
"Alternative approach would be to copy whole dummy handling and rename
it to "snd-soc-null" or something similar. And remove hwparams
assignment to make it really do nothing."
However, looking at it again, I would consider the existence of
dummy_dma_open() to be scope creep. If component is really a dummy one
it should not affect any other components in any way. And if any drivers
depends on dummy setting parameters for it, I would consider it
partially broken. And would say that issue should rather be fixed on
driver side by making a dedicated component for it instead of using a
dummy one.
I hope that I cleared up situation a bit.
Thanks,
Amadeusz
More information about the Alsa-devel
mailing list