Hi Brian Thank you for your feedback
> There are 4 drivers calling that: > > snd_soc_dummy_probe > rt5514_spi_probe > 2 instances of snd_dmaengine_pcm_register, via rockchip_i2s_probe > > Only the latter two seem to run the assignment here: > > if (platform_drv->pcm_new) > platform->component.pcm_new = snd_soc_platform_drv_pcm_new; > > Both snd_soc_dummy_probe and rt5514_spi_probe find ->pcm_new NULL here. Hmm... The crasher was snd_dmaengine_pcm_register's platform ? This means, in your current kernel, dmaengine platform dosn't call its .pcm_new (= dmaengine_pcm_new) somehow ? I'm wondering why ->pcm_new became NULL which exists on probe timing ? Can you check component and driver by this patch ? This is very rough but enough for debug --------------------- diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 5933851..43da1ec 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3322,6 +3322,10 @@ static int snd_soc_platform_drv_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_platform *platform = rtd->platform; + printk("-------use name: %s, %p\n", + platform->component.name, + platform->driver); + return platform->driver->pcm_new(rtd); } @@ -3356,8 +3360,12 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform, platform->component.probe = snd_soc_platform_drv_probe; if (platform_drv->remove) platform->component.remove = snd_soc_platform_drv_remove; - if (platform_drv->pcm_new) + if (platform_drv->pcm_new) { + printk("-------add name: %s, %p\n", + platform->component.name, + platform->driver); platform->component.pcm_new = snd_soc_platform_drv_pcm_new; + } if (platform_drv->pcm_free) platform->component.pcm_free = snd_soc_platform_drv_pcm_free; ---------------------